Код:
class Animal {
constructor(name) {
this.speed = 0;
this.name = name;
}
run(speed) {
this.speed = speed;
alert(`${this.name} бежит со скоростью ${this.speed}.`);
}
stop() {
this.speed = 0;
alert(`${this.name} стоит.`);
}
}
class Rabbit extends Animal {
hide() {
alert(`${this.name} прячется!`);
}
stop() {
super.stop(); // вызываем родительский метод stop
this.hide(); // и затем hide
}
}
let rabbit = new Rabbit("Белый кролик");
rabbit.run(5);
Непонятно следующее: при вызове
rabbit.run(5);
let rabbit
выглядит так:
let rabbit = {
speed: 0,
name:"Белый кролик",
prototype: {
constructor: Rabbit,
hide(){...},
stop(){...},
prototype: {
constructor: Animal,
run(speed) {...},
stop(){...};
}
}
};
Каким образом
run(speed) {...},
откуда берет значение this.name?
Ведь при создании класса
Animal
создается функция с аналогичным названием, в которой есть как бы невидимый объект
this = {
speed = 0;
name = name;
},
в результате он становится частью кода объекта rabbit и внутри него хранится prototype с вложенным prototype.
Каким образом
run(speed) {...}
достает нужный нам this.name?
Вообще не понимаю.