Прошу прощения, потому что эта тема поднимается часто, но я не смог адекватно объяснить это во всем, что я читал сегодня.
Я пытаюсь создать простой класс коллекции (и в то же время узнать о прототипировании 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
?