Так что методы stati c родительского класса наследуются подклассом, потому что они сделали конструктор родительского класса прототипом конструктора дочернего класса.
Собственный синтаксис class
делает то же самое:
class Parent {
static example() {
console.log("Parent.example");
}
}
class Child extends Parent {
}
console.log(Child.example()); // "Parent.example"
console.log(Child.hasOwnProperty("example")); // false
console.log("example" in Child); // true, because it's inherited
console.log(Object.getPrototypeOf(Child) === Parent); // true
Помните, что функции - это объекты. Объекты могут иметь прототипы. Объект наследует свойства от своего прототипа. В приведенном выше примере Child
(объекты функций) имеет Parent
(объект функции) в качестве прототипа, поэтому он наследует свойство example
. До ES5 у функции, созданной с кодом JavaScript, всегда был Function.prototype
в качестве прототипа, но, начиная с ES2015, это не всегда так. Синтаксис class
делает конструктор суперкласса прототипом конструктора подкласса. Вы также можете изменить прототип функции после ее создания с помощью Object.setPrototypeOf
, но обычно лучше избегать изменения прототипа существующего объекта.
В главе 4 моей новой книги JavaScript: Новые игрушки , я использую следующий пример, чтобы проиллюстрировать эту концепцию (детали опущены):
class Color {
}
class ColorWithAlpha {
}
вместе с этой диаграммой, чтобы показать две параллельные цепи прототипов, созданные этим, одну для Сами функции конструктора и другие для объектов, которые они назначают в качестве прототипа при использовании для создания объектов: