Как разорвется цепочка прототипов?

#javascript #ecmascript-6

#javascript #ecmascript-6

Вопрос:

Я пытаюсь изучить наследование в JavaScript.В этой статье о MDN объясняется, как работает цепочка прототипов.

 
let f = function () {
   this.a = 1;
   this.b = 2;
}
let o = new f(); // {a: 1, b: 2}


f.prototype.b = 3;
f.prototype.c = 4; 

 

есть комментарий, в котором говорится

 // do not set the prototype f.prototype = {b:3,c:4}; this will break the prototype chain
 

Как это приведет к разрыву цепочки? . Я предполагаю, что это потому, что мы перезаписываем объект прототипа функции конструктора, поэтому все остальные ссылки восходящей цепочки теряются.Но мы могли бы установить object в f.prototype, используя Object.create(someobject), и это не разорвет цепочку.

Комментарии:

1. Я предполагаю, что это потому, что мы перезаписываем объект прототипа функции конструктора, поэтому все остальные ссылки восходящей цепочки теряются . Не совсем. Дело не в том, что ссылка на восходящую цепочку теряется. Дело в том, что вы заменили текущий прототип, поэтому все остальное, что уже было в прототипе, теперь потеряно. Это то же самое, что делать let x = {a: 1} , а затем делать x = {b: 2} . Вы заменили весь объект, которому был назначен x другой объект, поэтому, когда вы это сделаете console.log(x) , у него не a будет свойства.

Ответ №1:

 f.prototype = Object.create(someobject);

 

свойства и метод someobject будут доступны в f.protoype object . И, следовательно, все экземпляры f будут иметь эти методы и свойства, доступные для них.

Почему это не разорвет цепочку?

Object.create() напрямую создает объект на основе предоставленного аргумента (prototype). сам аргумент (может) иметь все ссылки, доступные через его свойство [[prototype]]