Если вы планируете какое-либо наследование, я бы порекомендовал 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
все еще думает, что это суперкласс; в этом примере это может показаться несущественным, но если вы пытаетесь ссылаться на функции-члены, которые были переопределены, или на новые переменные-члены, вы столкнетесь с проблемами.
person
Andrew Odri
schedule
20.02.2015
SomeObject.print
кажется естественным. Ноthis.n
внутри не имеет смысла, поскольку нет экземпляра, если мы говорим о статических методах. - person dfsq   schedule 20.02.2015printN
не статичен. - person simonzack   schedule 20.02.2015