Si está planeando hacer algún tipo de herencia, entonces lo recomendaría this.constructor
. Este simple ejemplo debería ilustrar por qué:
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()
iniciará sesión ConstructorSuper Hello ConstructorSuper!
en la consola
test2.callPrint()
iniciará sesión ConstructorSub Hello ConstructorSub!
en la consola
La clase nombrada no se ocupará muy bien de la herencia a menos que redefina explícitamente cada función que haga referencia a la Clase nombrada. Aquí hay un ejemplo:
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()
iniciará sesión NamedSuper Hello NamedSuper!
en la consola
test4.callPrint()
iniciará sesión NamedSuper Hello NamedSub!
en la consola
Ver todo lo anterior en ejecución en Babel REPL .
Puedes ver en esto que test4
todavía piensa que está en la superclase; en este ejemplo, puede no parecer un gran problema, pero si está tratando de hacer referencia a funciones de miembros que han sido anuladas o nuevas variables de miembros, se encontrará en problemas.
SomeObject.print
se siente natural Pero porthis.n
dentro no tiene sentido ya que no hay instancia, si estamos hablando de métodos estáticos.