Объекты и массивы - это не то, что следует добавлять к прототипу , если только вы не захотите поделиться ими со всеми экземплярами.
Как только вы захотите, чтобы свойства этих объектов были другимидля каждого экземпляра необходимо назначить объект в конструкторе (или в любой другой функции) конкретному экземпляру:
this.subClass = {
foo: true
// potentially other properties
};
Тем не менее, в некоторых случаях в объекте может быть объект «по умолчанию».Прототип может быть разумным, но вы не должны писать в него.
Назначение объекта в конструкторе вместо этого не дублирует код и позволяет изменять его для каждого экземпляра индивидуально.
Обновление:
Если вы не хотите изменять исходный конструктор, вы можете просто добавить новую функцию в прототип и вызывать ее всякий раз, когда создаете экземпляр объекта:
MyClass.prototype.init = function() {
this.subClass = {
//...
};
};
и
var obj = new MyClass();
obj.init();
Или вы действительно создаете новую функцию конструктора:
function MySubClass() {
MyClass.apply(this, arguments);
// now create that object for each instance
this.subClass = {
foo: someValue
};
}
inherits(MySubClass, MyClass);
, где inherits
определяется как:
function inherits(Child, Parent) {
var Tmp_ = function() {};
Tmp_.prototype = Parent.prototype;
Child.prototype = new Tmp_();
Child.prototype.constructor = Child;
}
Тогда вы будете использовать MySubClass
вместо MyClass
для создания экземпляров.