Первый код:
function Animal() {}
Animal.prototype.eat = function() {
console.log("nom nom nom");
};
function Dog() {}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype = {
constructor: Dog,
bark: function() {
console.log("Woof!");
}
};
let beagle = new Dog();
console.clear();
beagle.eat(); // Should print "nom nom nom" but displays a error that eat
//is not a function.
beagle.bark();
Второй код:
function Animal() {}
Animal.prototype.eat = function() {
console.log("nom nom nom");
};
function Dog() {}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
Dog.prototype.bark = function() {
console.log("Woof!");
}
let beagle = new Dog();
console.clear();
beagle.eat(); // Prints "nom nom nom"
beagle.bark(); // Prints "Woof!"
Что случилось с первым фрагментом кода, который beagle.eat()
не показывает правильный вывод.
Сначала вы назначаете прототип Dog
как Object.create(Animal.prototype);
, но затем на следующей строке вы полностью переназначаете прототип Dog
для чего-то другого, поэтому цепочка наследования больше не существует. При настройке вашего первого кода вы можете просто назначить Dog.prototype
только один раз и использовать Object.assign
вместе с Object.create
:
function Animal() {}
Animal.prototype.eat = function() {
console.log("nom nom nom");
};
function Dog() {}
Dog.prototype = Object.assign(
Object.create(Animal.prototype),
{
constructor: Dog,
bark: function() {
console.log("Woof!");
}
}
);
let beagle = new Dog();
beagle.eat();
Animal.prototype
внутриDog.prototype
используя оператор распространения. Это будет работать? Как альтернатива для наследования родительской функции с помощьюObject.create()
.Dog.prototype = { ...Animial.prototype, constructor: Dog, bark: ... }
Но там не будет никакого наследования, вы просто скопируете ссылки на функции прототипаAnimal
, ноDog
самом деле не была бы связана сAnimal
. Например, если вы добавили функцию к прототипуAnimal
после назначения прототипаDog
, если вы использовали распространение, а неObject.create
, любойDog
не будет иметь доступа к новой функции вAnimal
. Итак, лучше использоватьObject.create