class A { data1 = 1; constructor(){ this.data2 = 2; } test() { console.log(this) } } class B extends A { constructor() { super(); } funcA() { this.test() } funcB() { super.test() } } let foo = new B() foo.funcA(); foo.funcB(); ¿Cuál es la diferencia entre funcA() y funcB() al llamar, o son exactamente lo mismo? Por cierto, ¿cuál es la diferencia entre data1 y data2 declarados dentro y fuera del constructor, que es el preferido?
Con this.test() , hace referencia a la instancia . No existe ninguna propiedad de test directamente en la instancia, por lo que, al igual que con la herencia de prototipos estándar, se examina el objeto prototipo en busca de la propiedad. Este prototipo es A.prototype , que tiene una propiedad de test , por lo que se llama.
Con super.test() , en su lugar, comienza a buscar la propiedad de test en la superclase - A.prototype , que se encuentra inmediatamente y se llama.
Si también tuviera un método de test en B, vería la diferencia.
class A { data1 = 1; constructor(){ this.data2 = 2; } test() { console.log('a') } } class B extends A { constructor() { super(); } test() { console.log('b'); } funcA() { this.test() } funcB() { super.test() } } const foo = new B() foo.funcA(); foo.funcB();Por cierto, ¿cuál es la diferencia entre data1 y data2 declarados dentro y fuera del constructor, que es el preferido?
Tu decides. Sin embargo, los campos de clase (asignación fuera del constructor) son un poco más concisos (especialmente si su constructor no contiene nada más) pero menos compatibles; si desea usarlos, asegúrese de transpilar su código.