Acabo de enfrentar el comportamiento extraño que no entiendo. Puede ejecutar este código usted mismo y ver.
class Base { get = () => { console.log('i am the Base function'); } } class Child extends Base { get () { console.log('i am the Child function'); } } const child = new Child(); child.get(); // outputs 'i am the Base function'
Se supone que debe ser así? ¿Puedes explicarme por qué? Y la pregunta más importante: ¿cómo superar esto? Todo lo que quiero es anular la propiedad 'obtener' y aún poder acceder a 'obtener' desde la clase principal. No puedo editar la clase base .
De hecho, encontré la solución. Puedo hacer algo como esto:
class Base { get = () => { console.log('i am the Base function'); } } class Child extends Base { constructor() { super(); this.parentGet = this.get; this.get = () => { console.log('i am the Child function'); this.parentGet(); } } } const child = new Child(); child.get(); // outputs 'i am the Child function' and then 'i am the Base function'
Pero no me parece bien.
Está utilizando la sintaxis del método de instancia en la clase principal. Eso significa que la inicialización de la propiedad ocurrirá en el constructor de la clase principal, por lo que ocultará el método en el prototipo.
Si usa la sintaxis de función normal (método) en el padre, funcionará como espera.
class Base { get () { console.log('i am the Base function'); } }
Alternativamente, podría hacer lo mismo que su solución al hacer que la propiedad secundaria también sea una propiedad de instancia. Sin embargo, usar una función de flecha como método de clase , que es posible como ha descubierto, es probablemente algo que no debería hacer a menos que realmente comprenda lo que está obteniendo de esa opción.
Para explicar más: en su código Base
original, la declaración crea un método de instancia. Eso significa que funciona como si su clase se viera así:
class Base { constructor() { this.get = () => console.log("i am the Base function"); } }
En otras palabras, la propiedad "get" está directamente en la instancia construida y no en Base.prototype
. Por lo tanto, esa propiedad de instancia significa que JavaScript no se molestará en mirar la cadena de prototipos cuando se llame a someObject.get()
.
Por lo tanto, la respuesta directa a su pregunta es "no"; JavaScript permite que los métodos de la subclase anulen los métodos de la clase principal a través del funcionamiento normal de la cadena de prototipos. Sin embargo, la respuesta es "sí" cuando la clase principal crea una propiedad de instancia que oculta algo en la cadena de prototipos.