#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]]