Классы более или менее просто 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());