@Captain96

Как идет наследование?

Почему код идет по такой иерархии?
function Animal(name) {
  this.name = name;
  this.speed = 0;
}
 
Animal.prototype.run = function(speed) {
  this.speed += speed;
  alert( this.name + ' бежит, скорость ' + this.speed );
};
 
function Rabbit(name) {
  this.name = name;
  this.speed = 0;
}
 
// задаём наследование
Rabbit.prototype = Object.create(Animal.prototype);
 
// и добавим свой метод (или методы...)
Rabbit.prototype.jump = function() {  };
 
 
var rabbit = new Rabbit("Kuzy");
console.dir(rabbit);


https://learn.javascript.ru/article/...bit-animal.png - иерархия

Мне все кажется, что должно быть так:

В Rabbit.prototype будет Animal.prototype (объект) и в этом объекте к этим свойствам прибавляется jump.
  • Вопрос задан
  • 265 просмотров
Пригласить эксперта
Ответы на вопрос 1
mudrenokanton
@mudrenokanton
frontend dev
При создании объекта — вызывается функция конструктор, у которой this привязана к этому объекту.

Прототип (он же свойство .__proto__) этого, ново-созданного, объекта — объект, который является свойством .prototype у функции конструктора.

Когда делаем такого рода наследование, мы не можем тупо присвоить одному свойству другое, т.к. объект передается по ссылке и мы в итоге сделаем еще одну ссылку на тот-же объект. И при изменении Rabbit.prototype будет меняться Animal.prototype. А нам такого счастья не надо, нам надо чтобы Rabbit.prototype.jump было только свойством(в цепочке прототипов) объектов Rabbit, потому нам надо привязать его к другому(новому) объекту, для этого нам и нужен Object.create().

+ мы в функции конструкторе Rabbit можем не дублировать создание свойств у Animal, а просто его вызвать с привязкой к текущему объекту: Animal.call(this, name)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы