Отличается между foo.prototyp.x = & foo.prototype = {x:} - PullRequest
4 голосов
/ 04 января 2012

Я не понимаю, почему результаты fooA и fooB различаются.

var foo = function(){}

fooA = new foo();

foo.prototype.x = 1;
foo.prototype = { y: 2, z: 3};

console.log(fooA.x, fooA.y, fooA.z);// 1, undefined, undefined

fooB = new foo();
console.log(fooB.x, fooB.y, fooB.z);// undefined, 2, 3
  1. foo.prototyp = {} переопределяет метод, определенный перед ним?

  2. Почему fooA - это состояние перед prototype.x, оно наследует результат, но не y и z?

Ответы [ 3 ]

4 голосов
/ 04 января 2012

Причиной такого поведения является то, что вы заставляете foo.prototype указывать на новый объект при использовании foo.prototype = { y: 2, z: 3};, и прототипы существующих объектов не изменяются, когда для свойства prototype конструктора устанавливается новое значение.

Построчное объяснение того, что происходит:

var foo = function(){}
foo.prototype инициализируется как пустой объект (мы назовем этот объект A).

fooA = new foo()
fooA установлен на новый объект foo, его прототип установлен на foo.prototype (A).

foo.prototype.x = 1
Поскольку прототип fooA является тем же объектом, что и foo.prototype, fooA.x становится 1. Другими словами, A получает свойство x = 1.

foo.prototype = { y: 2, z: 3};
Мы создаем новый объект, который имеет свойства y = 2 и z = 3. Мы назовем этот объект B. foo.prototype установлен для нового объекта.

console.log(fooA.x, fooA.y, fooA.z);
Прототип fooA по-прежнему A, который имеет только свойство x = 1.

fooB = new foo();
Мы создаем новый объект foo, прототип которого B.

console.log(fooB.x, fooB.y, fooB.z);
Прототипом fooB является B, который имеет свойства y = 2 и z = 3, но не свойство x.

2 голосов
/ 04 января 2012

Рассмотрим

var foo = function(){}

fooA = new foo();

foo.prototype.x = 1;
console.log(fooA.__proto__) // {x:1}

foo.prototype = { y: 2, z: 3};
console.log(fooA.__proto__) // still {x:1}

Прототип объекта назначается во время создания (при вызове new) и впоследствии не изменяется.Подробнее см. здесь .

1 голос
/ 04 января 2012

Этот

F.prototype = { ... };

заменяет prototype объект конструктора F.Старый prototype объект заменяется новым prototype объектом.

Экземпляры F

var f = new F();

имеют неявную ссылку на прототип , которая ссылается наprototype объект конструктора F.Однако эта ссылка устанавливается во время инициализации экземпляра.

Например,

var f1 = new F();
F.prototype = { ... };
var f2 = new F();

Здесь ссылка на прототип f1 относится к старому объекту prototype, тогда какссылка прототипа f2 ссылается на новый объект prototype.

Обратите внимание, что даже если объект F.prototype был заменен, старый объект prototype будет продолжать существовать до тех пор, пока существует хотя бы один экземпляр F, ссылка на прототип на который ссылается.

...