Что именно наследует производный класс от своего базового класса? - PullRequest
5 голосов
/ 17 января 2020

В настоящее время я изучаю классы ES6 для Javascript, и я, кажется, понимаю их концепцию, но я не понимаю, что производный класс наследует от своего базового класса. Это методы класса? Безопасно ли предполагать, что методы класса являются свойствами указанного класса? В этом случае они являются частью прототипа и, таким образом, наследуются объектами в цепочке прототипов. А что насчет конструктора? Свойства, определенные внутри конструктора, унаследованы?

Спасибо за внимание!

Ответы [ 2 ]

7 голосов
/ 17 января 2020

Классы более или менее просто syntacti c сахар для настройки наследования прототипа.

class Derived extends Base {}

эквивалентно

function Derived(...args) {
  return Base.apply(this, args);
}

Object.setPrototypeOf(Derived, Base);
Object.setPrototypeOf(Derived.prototype, Base.prototype);

Есть некоторые "волхвы c" связан с super и в будущем с полями publi c и private class, но базовые отношения c между объектами одинаковы.

Можно ли предположить, что методы класс свойства этого класса? В этом случае они являются частью прототипа и, таким образом, наследуются объектами в цепочке прототипов.

Да, методы становятся свойствами соответствующего объекта prototype, от которого наследуются все экземпляры. Т.е.

class Foo {
  bar() {}
}

эквивалентен

function Foo() {}
Foo.prototype.bar = function() {}

И поскольку объект "базовый класс" property находится в цепочке прототипов производного класса, все его методы доступны для экземпляры производного класса.

Являются ли свойства, определенные внутри конструктора, унаследованными?

"Унаследованное" - здесь не то слово. Свойства создаются в самом экземпляре, поскольку так работают конструкторы.

Считайте, что процесс выглядит следующим образом:

// Create new instance
var newInstance = Object.create(Derived.prototype);

// Call base constructor with `this` set to new instance
Base.apply(newInstance);

// Call derived constructor with `this` set to new instance
Derived.apply(newInstance);

Если базовый конструктор содержал что-то вроде this.base = 42;, то это свойство будет создано непосредственно в новом экземпляре, поскольку this относится к новому экземпляру.

Примечание: На самом деле точный поток немного отличается из-за факта расширения встроенного в таких классах, как Array, требуется специальная обработка, но конечный результат примерно такой же.


Вы не спрашивали о static методах, но они все еще являются частью наследования. Методы static становятся свойствами самой функции конструктора.

class Foo {
  static bar() {}
}

эквивалентно

function Foo() {}
Foo.bar = function() {}

, поскольку конструктор базового класса становится прототипом конструктора производного класса все свойства, определенные в базовом конструкторе, доступны производному конструктору.


Инструменты разработчика в вашем браузере могут показать вам все это:

class Base {

  static staticBase() {}
  
  constructor() {
    this.base = 42;
  }
  
  fromBase() {}
}

class Derived extends Base {

  static staticDervied() {}
    
  constructor() {
    super(); // necessary since we extend base
    this.derived = 21;
  }
  
  fromDerived() {}
}

console.dir(Derived);
console.dir(new Derived());

enter image description here

0 голосов
/ 03 февраля 2020

Есть много хороших ресурсов о фундаментальном примере es06 - https://exploringjs.com/es6/ch_classes.html#details -подкласса

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