Понимание ООП Javascript: экземпляры, модифицирующие другие экземпляры - PullRequest
4 голосов
/ 27 декабря 2010

У меня возникли проблемы с пониманием, почему изменение свойства в экземпляре a изменяет то же свойство в экземпляре b.

var A = function (){

};

A.prototype.data = {
    value : 0
};

var a = new A();
var b = new A();

console.log(a.data.value, b.data.value); // 0, 0
a.data.value = 5;
console.log(a.data.value, b.data.value); // 5, 5

Разве ключевое слово prototype не должно превращать переменную data в переменную экземпляра?

Это, кажется, не тот случай в этом примере, который выполняется как ожидалось:

var B = function (){
    this.data = {
        value : 0
    };
};

var i = new B();
var j = new B();

console.log(i.data.value, j.data.value); // 0, 0
i.data.value = 5;
console.log(i.data.value, j.data.value); // 5, 0

Я запутался, почему метод-прототип не работает. Может быть, мне не хватает некоторых концептуальных знаний.

Ответы [ 5 ]

3 голосов
/ 28 декабря 2010

Потому что это действительно так:

var A = function (){

};

var someObj = { value:0 };

A.prototype.data = someObj;

Таким образом, все экземпляры A теперь имеют свойство с именем data, которое указывает на объект someObj. Во всех случаях это один и тот же объект. И вы меняете value внутри этого объекта.

A не владеет value. Он содержит ссылку на объект, которому принадлежит value.

1 голос
/ 28 декабря 2010

Разве ключевое слово prototype не должно превращать переменную данных в переменную экземпляра?

Это делает с точностью до наоборот.A.prototype используется всеми объектами, созданными A.Когда вы индексируете объект, созданный с помощью A, если индекс отсутствует, JavaScript попытается разрешить этот индекс с помощью прототипа объекта (например, o.constructor.prototype).В этом случае вы индексируете a и b с data, которого нет в этих объектах, поэтому он использует тот, что в их прототипе.

0 голосов
/ 28 декабря 2010

Как раз наоборот. Прототип является общим для всех экземпляров. JavaScript - это прототип языка, который является более общим, чем классические ОО-языки. Я хорошее резюме Прототип наследования . Вы также можете немного узнать о io language , который является более "чистым" языком прототипов, который может помочь лучше понять JavaScript.

0 голосов
/ 28 декабря 2010

Прототип в js - это данные , совместно используемые между всеми экземплярами этого класса, это как статическая переменная из классических языков oop.Иногда бывает полезно поместить некоторые методы / поля в .prototype для экономии памяти во время выполнения.

0 голосов
/ 28 декабря 2010

a и b имеют одинаковый прототип. поэтому их прототипы имеют общие свойства. в этом разница между классическим и прототипным наследованием .

...