Если вы планируете заниматься каким-либо наследством, я бы порекомендовал 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внутри нет смысла, так как нет примера, если мы говорим о статических методах.