Рассмотрим класс, полный студентов.Поместить что-то на прототип - это все равно что положить что-то на белую доску, чтобы они все могли ее увидеть.Когда вы объявляете
Collection.prototype._innerList = [];
, вы даете каждой коллекции это свойство;независимо от того, что вы звоните new Collection()
, любые изменения в доске влияют на всех учеников.Однако, если вы определите его в конструкторе или в одной из функций как this.variableName = []
, у каждой копии будет свое собственное имя_переменной, как раздача каждому ученику раздаточного материала.Очевидно, что в некоторых случаях вполне нормально иметь что-то на доске, например инструкции, которые будут универсальными для каждого учащегося, но если каждый элемент будет отличаться для каждого учащегося, это должно быть индивидуальное свойство.Надеюсь, что это объяснение имеет смысл ...
Вы хотите это сделать.
function Collection() {
if (!this instanceof Collection)
return new Collection();
this._innerList = [];
this._xref = {};
return this;
}
Collection.prototype.count = function() {
return this._innerList.length;
};
Collection.prototype.add = function(obj) {
this._xref[obj.name] = this._innerList.push(obj) - 1;
}
Collection.prototype.get = function(id) {
if (typeof id == "string") {
return this._innerList[this._xref[id]];
} else {
return this._innerList[id];
}
};
var foo = new Collection();
foo.add({name: "someitem", value:"hello world"});
console.log(foo.count()); // 1
var bar= new Collection();
bar.add({name: "someotheritem", value:"hello world"});
console.log(bar.count()); // 1
http://jsfiddle.net/vXbLL/
Редактировать
Не имеет отношения ктвой вопрос, но это то, что я делаю, поэтому я брошу его туда.Всякий раз, когда я делаю что-то с прототипом, если я не возвращаю что-то, я возвращаю this
.Это позволяет создавать цепочки, так что вы можете сделать instance.function1().function2().function3()
до тех пор, пока function1
и function2
вернут this
.