Якщо ви плануєте робити будь-який вид спадщини, то я б рекомендував this.constructor
. Цей простий приклад повинен ілюструвати, чому:
class ConstructorSuper {
constructor(n){
this.n = n;
}
static print(n){
console.log(this.name, n);
}
callPrint(){
this.constructor.print(this.n);
}
}
class ConstructorSub extends ConstructorSuper {
constructor(n){
this.n = n;
}
}
let test1 = new ConstructorSuper("Hello ConstructorSuper!");
console.log(test1.callPrint());
let test2 = new ConstructorSub("Hello ConstructorSub!");
console.log(test2.callPrint());
test1.callPrint()
увійде ConstructorSuper Hello ConstructorSuper!
до консолі
test2.callPrint()
увійде ConstructorSub Hello ConstructorSub!
до консолі
Іменований клас не матиме належного поводження зі спадщиною, якщо ви чітко не переглянете кожну функцію, яка робить посилання на названий Клас. Ось приклад:
class NamedSuper {
constructor(n){
this.n = n;
}
static print(n){
console.log(NamedSuper.name, n);
}
callPrint(){
NamedSuper.print(this.n);
}
}
class NamedSub extends NamedSuper {
constructor(n){
this.n = n;
}
}
let test3 = new NamedSuper("Hello NamedSuper!");
console.log(test3.callPrint());
let test4 = new NamedSub("Hello NamedSub!");
console.log(test4.callPrint());
test3.callPrint()
увійде NamedSuper Hello NamedSuper!
до консолі
test4.callPrint()
увійде NamedSuper Hello NamedSub!
до консолі
Дивіться все вищезазначене в Babel REPL .
Ви можете бачити з цього, що test4
все ще думає, що це в суперкласі; у цьому прикладі це може не здатися величезною угодою, але якщо ви намагаєтеся посилатись на функції учасників, які були переопрацьовані або нові змінні члена, ви опинитесь у біді.
SomeObject.print
відчуває себе природним. Алеthis.n
всередині немає сенсу, оскільки немає жодного примірника, якщо ми говоримо про статичні методи.