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