Как класс наследует метод от своего родительского класса? - PullRequest
0 голосов
/ 03 августа 2020

Мой вопрос о том, как класс (Teacher) наследует метод (greeting) от своего родительского класса (Person).

class Person { 

  constructor(name) { 
    this.name = name
  }

  greeting() { 
    console.log(`Hi! I'm ${this.name}`); 
  };

}

class Teacher extends Person { 
  constructor(first, subject) { 
    super(first); 

    this.subject = subject; 
  }
}

person = new Person;
teacher = new Teacher;

Я использую приведенный выше фрагмент в качестве примера. Копирую в консоль браузера. Я не был уверен, чего ожидать, когда я console.dir(Person), но вижу, что это похоже на объект Function. Поэтому неудивительно, что Person.prototype.__proto__ указывает на Object.prototype, как и функция.

Я также не был уверен, чего ожидать от console.dir(Teacher). Teacher.prototype.__proto__ также указывает на Object.prototype. Здесь не упоминается приветствие farewell от Person, но я знаю, что экземпляр Учителя может его использовать. Как Teacher / экземпляр Teacher имеет доступ к Person.prototype?

Я знаю, что в типичном прототипном наследовании Function.prototype имеет __proto__, который указывает на Object.prototype.
Я также считаю, что классы - это синтаксический сахар по сравнению с прототипным наследованием (что, как мне кажется, означает тот же процесс, но сокращенный синтаксис).

Вот полезная фотография того, что я вижу, когда вижу Учителя

1 Ответ

0 голосов
/ 03 августа 2020

Синтаксис класса ES6 является синтаксическим сахаром для JavaScript. Это просто функции и [function].prototype за кулисами (и функции тоже являются объектами).

В JS у нас есть прототипное наследование, что означает, что у нас есть объекты, построенные на других объектах - это будет объект Function.prototype.

Когда вы пишете метод класса, вы фактически украшаете объект [function].prototype

Когда вы расширяете базовый класс, прототип вашего дочернего класса будет построен на основе объекта-прототипа суперкласса (функции). Прототипное наследование позволит вам автоматически получить доступ к свойствам суперкласса (объекта). . Это было полезно, например, для базового поведения виджетов (создание разметки, форматирование и т.д. c.) И атрибутов экземпляра (имена, имена типов, атрибуты c и т.д. c.). Если вы действительно хотите понять прототипное наследование, я предлагаю вам также поискать это. =)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...