Se você planeja fazer algum tipo de herança, eu recomendaria this.constructor
. Este exemplo simples deve ilustrar o motivo:
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()
registrará ConstructorSuper Hello ConstructorSuper!
no console
test2.callPrint()
registrará ConstructorSub Hello ConstructorSub!
no console
A classe nomeada não tratará bem da herança, a menos que você redefina explicitamente todas as funções que fazem referência à classe nomeada. Aqui está um exemplo:
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()
registrará NamedSuper Hello NamedSuper!
no console
test4.callPrint()
registrará NamedSuper Hello NamedSub!
no console
Veja todas as opções acima em execução no Babel REPL .
Você pode ver disso que test4
ainda acha que está na super classe; neste exemplo, pode não parecer muito importante, mas se você estiver tentando fazer referência a funções-membro que foram substituídas ou a novas variáveis-membro, estará com problemas.
SomeObject.print
parece natural. Mas porthis.n
dentro não faz sentido, pois não há exemplo, se estamos falando de métodos estáticos.