Откуда берется this.name?

Код:
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?

Вообще не понимаю.
  • Вопрос задан
  • 156 просмотров
Пригласить эксперта
Ответы на вопрос 2
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
Ну элементарная же цепочка, что тут может быть непонятно?
  1. new Rabbit("Белый кролик")
  2. Rabbit extends Animal

  3. class Animal {
      constructor(name) {
        this.name = name;
      }
    }


Ответ написан
Ваш ответ на вопрос

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

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