Я сейчас читаю книгу Кайла Симпсона «Ты не знаешь Дж.С.», пытаясь понять всю модель прототипа.
В нем говорится, что мы можем достичь наследования прототипов между Foo и Bar следующим образом:
function Foo(name) {
this.name = name;
}
Foo.prototype.myName = function () {
return this.name;
};
function Bar(name, label) {
Foo.call(this, name);
this.label = label;
}
// here, we make a new `Bar.prototype`
// linked to `Foo.prototype`
Bar.prototype = Object.create(Foo.prototype);
// Beware! Now `Bar.prototype.constructor` is gone,
// and might need to be manually "fixed" if you're
// in the habit of relying on such properties!
Bar.prototype.myLabel = function () {
return this.label;
};
var a = new Bar("a", "obj a");
console.log(a.myName()); // "a"
console.log(a.myLabel()); // "obj a"
Я так понимаю, ссылка сделана в строке
Bar.prototype = Object.create(Foo.prototype);
, так что прототип Бар указывает на объект, прототип которого Foo.prototype
.
Мне было интересно, почему бы нам просто не сделать это:
Bar.prototype = Object.assign({}, Foo.prototype);
Мы достигли того же результата, и теперь у нас есть один уровень поиска цепочки прототипов для всех методов вместо двух.