Доступ к унаследованной функции от ребенка

1

Первый код:

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() не показывает правильный вывод.

Теги:
inheritance

1 ответ

5
Лучший ответ

Сначала вы назначаете прототип 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();
  • 1
    Спасибо приятель. У меня есть один вопрос, если я разверну Animal.prototype внутри Dog.prototype используя оператор распространения. Это будет работать? Как альтернатива для наследования родительской функции с помощью Object.create() .
  • 1
    В ограниченной степени, да, вы можете использовать spread: Dog.prototype = { ...Animial.prototype, constructor: Dog, bark: ... } Но там не будет никакого наследования, вы просто скопируете ссылки на функции прототипа Animal , но Dog самом деле не была бы связана с Animal . Например, если вы добавили функцию к прототипу Animal после назначения прототипа Dog , если вы использовали распространение, а не Object.create , любой Dog не будет иметь доступа к новой функции в Animal . Итак, лучше использовать Object.create

Ещё вопросы

Сообщество Overcoder
Наверх
Меню