¿Por qué JavaScript permite métodos duplicados?
Descubrí hoy que esto parece ser JavaScript legal:
class foo {
a() { console.log( 'a' ); }
b() { console.log( 'b' ); }
a() { console.log( 'a2' ); }
}
( new foo() ).a(); // muestra a2
La función a()
se enumera dos veces, pero JavaScript simplemente ignora la primera. ¿Por qué esto es legal? ¿Cuál es un caso de uso significativo para esta “característica”?
davy.ai
Explicación
Esto es legal en Javascript porque al definir una clase usando la palabra clave
class
, implícitamente se crea una función constructora y se agregan todos los métodos a su prototipo. Cuando se agregan métodos al prototipo, son simplemente propiedades con una función como valor. Si dos propiedades tienen el mismo nombre, la última definida anulará a las anteriores.En el ejemplo proporcionado, cuando se define la clase
foo
, se ignora la primera definición del métodoa()
y solo se agrega la segunda definición al prototipo. Cuando se crea una instancia defoo
y se llama al métodoa()
en ella, se hace referencia a la segunda definición, la cual muestra “a2” en la consola.Casos de uso significativos
Un caso de uso significativo para esta característica podría ser en situaciones donde una clase tiene valores o comportamientos predeterminados que pueden ser anulados por subclases. Por ejemplo, una clase
Vehículo
podría tener un métodoconducir()
predeterminado, pero las subclases comoCoche
oCamión
pueden anularlo con sus propias implementaciones.En tal caso, si la clase base ya tiene un método con el mismo nombre que el definido en la subclase, el método de la subclase lo anulará. Esto permite una mayor flexibilidad y personalización en jerarquías de clases.