Прототипы Javascript и создание экземпляров

Прошу прощения, потому что эта тема поднимается часто, но я не смог адекватно объяснить это во всем, что я читал сегодня.

Я пытаюсь создать простой класс коллекции (и в то же время узнать о прототипировании 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];
    }
};

http://jsfiddle.net/YrVFZ/

Проблема:

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 ?

13
задан Jamie Treworgy 29 April 2011 в 22:15
поделиться