Я извиняюсь, потому что эта тема очень много, но я не смог адекватно объяснить это во всем, что я читал сегодня.
Я пытаюсь создать простой класс коллекции (и узнать о прототипах javascript в то же время), предназначенный для хранения объектов с свойством "name" и позволяет доступ к его членам по индексу или значению. Пока у меня есть это:
function Collection() {}
Collection.prototype.constructor = Collection;
Collection.prototype._innerList = [];
Collection.prototype._xref = {};
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"}); // foo.count()== 1
var bar= new Collection();
bar.add({name: "someotheritem", value:"hello world"}); // bar.count()== 2
Хм...
В принципе, новый экземпляр bar
создается со всеми свойствами, имеющими текущие значения данных в foo
. Я знаю, что могу исправить это, поставив _xref и т.д. Внутри конструктора, но я пытаюсь понять, как работает прототипирование. Если я создаю новый экземпляр и вношу изменения в данные в этом экземпляре, почему эти значения переносятся при создании другого нового экземпляра?
Если я внесу дальнейшие изменения в свойство из прототипа foo
или bar
, они независимы, поэтому не похоже, что я каким-то образом ссылаюсь на один и тот же экземпляр чего-либо. Итак, что вызывает bar
для создания экземпляров с текущими значениями из foo
?