Вернуться к уроку

В чём ошибка в наследовании

важность: 5

Ошибка – в том, что метод walk присваивается в конструкторе Animal самому объекту вместо прототипа.

Поэтому, если мы решим перезаписать этот метод своим, специфичным для кролика, то он не сработает:

// ...

// записывается в прототип
Rabbit.prototype.walk = function() {
  alert( "прыгает " + this.name );
};

Метод this.walk из Animal записывается в сам объект, и поэтому он всегда будет первым, игнорируя цепочку прототипов.

Правильно было бы определять walk как Animal.prototype.walk.

Тем более, что этот метод является общим для всех объектов, тратить память и время на запись его в каждый конструктор определённо ни к чему.

Найдите ошибку в прототипном наследовании. К чему она приведёт?

function Animal(name) {
  this.name = name;

  this.walk = function() {
    alert( "ходит " + this.name );
  };

}

function Rabbit(name) {
  Animal.apply(this, arguments);
}
Rabbit.prototype = Object.create(Animal.prototype);

Rabbit.prototype.walk = function() {
  alert( "прыгает " + this.name );
};

var rabbit = new Rabbit("Кроль");
rabbit.walk();