Как выглядит наследование статических методов, если не пользоваться словом class?
Если пользоваться словом class, то довольно просто создать статическую функцию при помощи static, то же самое мы можем получить просто задав для нашей функции метод, таким образом их можно было бы вызывать на уровне как бы класса. Однако как наследовать данную функцию не используя extens, как если бы это было до появления классов в таком виде в каком они есть сейчас или, если сказать по другому: как это можно было бы сделать на не обновившейся платформе? При прототипном наследовании (Object.create(Parent)) всего родительского класса полученное просто не будет функцией, а у самого класса Function просто нет метода create. Буду рад, если кто-то поможет разобраться.
class Parent {
static PrintA = function() {
console.log("AAAAA");
}
}
class Heir extends Parent {}
console.log(Parent) // [Function: Parent] { PrintA: [Function: PrintA] }
Heir.PrintA(); // AAAAA
console.log(Heir) // [Function: Heir]
// Не выводит метод PrintA, но вызывает его, значит он получен, от Parent, как Object.create().
А тут как я понимаю тоже самое, только устаревшим методом ну или тем, который выполняется на самом деле (под капотом), если я конечно понимаю всё правильно.
function Parent() {}
// Создание статического метода, который можно вызвать на уровне класса
Parent.PrintA = function() {
console.log("AAAAA");
}
function Heir() {
Parent.apply(this, arguments);
}
Heir.prototype = Object.create(prototype); //передача прототипа, который создаётся при ключевом слове new
Heir.prototype.constructor = Heir; //чистая формальность, вызывается всё равно функция а не Heir.prototype.constructor
// Однако чтобы получить методы, которые у функции Parent (класса), на нужно сделать что-то такое
//Опробованные решения
Heir = Object.create(Parent); //это уже не будет классом, мы переназначаем переменную
Heir = Function.create(); //это тоже переназначает переменную
Ответы (1 шт):
Обратившись к спецификации в пункте 12 можно увидеть, что конструктору устанавливается в качестве прототипа значение constructorParent, ранее определенное как superclass. Установить прототип можно с помощью функции Object.setPrototypeOf()
function Parent() {}
// Создание статического метода, который можно вызвать на уровне класса
Parent.PrintA = function() {
console.log("AAAAA");
}
function Heir() {
Parent.apply(this, arguments);
}
Heir.prototype = Object.create(Parent.prototype); //передача прототипа, который создаётся при ключевом слове new
Heir.prototype.constructor = Heir; //чистая формальность, вызывается всё равно функция а не Heir.prototype.constructor
Object.setPrototypeOf(Heir, Parent);
Heir.PrintA();