Pasé las últimas dos horas tratando de encontrar una solución a mi problema, pero parece que no tiene remedio.
Básicamente, necesito saber cómo llamar a un método principal desde una clase secundaria. Todo lo que he intentado hasta ahora termina en no funcionar o sobreescribir el método principal.
Estoy usando el siguiente código para configurar OOP en javascript:
// SET UP OOP
// surrogate constructor (empty function)
function surrogateCtor() {}
function extend(base, sub) {
// copy the prototype from the base to setup inheritance
surrogateCtor.prototype = base.prototype;
sub.prototype = new surrogateCtor();
sub.prototype.constructor = sub;
}
// parent class
function ParentObject(name) {
this.name = name;
}
// parent's methods
ParentObject.prototype = {
myMethod: function(arg) {
this.name = arg;
}
}
// child
function ChildObject(name) {
// call the parent's constructor
ParentObject.call(this, name);
this.myMethod = function(arg) {
// HOW DO I CALL THE PARENT METHOD HERE?
// do stuff
}
}
// setup the prototype chain
extend(ParentObject, ChildObject);
Necesito llamar primero al método de los padres y luego agregarle algunas cosas más en la clase secundaria.
En la mayoría de los lenguajes OOP eso sería tan simple como llamar parent.myMethod()
Pero realmente no puedo entender cómo se hace en javascript.
Cualquier ayuda es muy apreciada, gracias!
fuente
ParentClass.prototype.myMethod.apply() or
ParentClass.prototype.myMethod.call () `, como lo hace con su constructor.ParentClass.prototype.myMethod.call(this, arg1, arg2, arg3...);
)myMethod
en tu clase.El estilo ES6 le permite utilizar nuevas funciones, como
super
palabras clave.super
La palabra clave tiene que ver con el contexto de la clase principal, cuando se utiliza la sintaxis de clases ES6 Como un ejemplo muy simple, finaliza la compra:Además, puede usar
super
para llamar al constructor principal:Y, por supuesto, puede usarlo para acceder a las propiedades de la clase principal
super.prop
. Entonces, usa ES6 y sé feliz.fuente
super
ser llamado? ¿Hay una equivalencia en el "viejo" JS?super()
en métodos estáticos; Parece que lo usaste en constructor.Bueno, para hacer esto, no está limitado con la
Class
abstracción de ES6. El acceso a los métodos prototipo del constructor principal es posible a través de la__proto__
propiedad (estoy bastante seguro de que habrá otros codificadores de JS para quejarse de que está depreciado) que se deprecia pero al mismo tiempo se descubre que en realidad es una herramienta esencial para las necesidades de subclasificación ( especialmente para las necesidades de subclases de Array). Entonces, aunque la__proto__
propiedad aún está disponible en todos los principales motores JS que conozco, ES6 introdujo laObject.getPrototypeOf()
funcionalidad además. Lasuper()
herramienta en laClass
abstracción es un azúcar sintáctico de esto.Entonces, en caso de que no tenga acceso al nombre del constructor principal y no quiera usar la
Class
abstracción, puede hacer lo siguiente;fuente
En caso de un nivel de herencia múltiple, esta función se puede usar como un método super () en otros idiomas. Aquí hay un violín de demostración , con algunas pruebas, puede usarlo así, dentro del uso de su método:
call_base(this, 'method_name', arguments);
Hace uso de funciones ES bastante recientes, no se garantiza la compatibilidad con navegadores antiguos. Probado en IE11, FF29, CH35.
fuente
¿Qué tal algo basado en la idea de Douglas Crockford:
fuente
Esta es una buena manera para que los objetos secundarios tengan acceso a las propiedades y métodos principales utilizando la cadena de prototipos de JavaScript, y es compatible con Internet Explorer. JavaScript busca métodos en la cadena de prototipos y queremos que la cadena de prototipos del niño tenga este aspecto:
Instancia secundaria -> Prototipo secundario (con métodos secundarios) -> Prototipo primario (con métodos principales) -> Prototipo de objeto -> nulo
Los métodos secundarios también pueden llamar métodos primarios sombreados, como se muestra en los tres asteriscos *** a continuación.
Así es cómo:
fuente
Existe una solución mucho más fácil y compacta para la búsqueda de prototipos multinivel, pero requiere
Proxy
soporte. Uso:SUPER(<instance>).<method>(<args>)
, por ejemplo, suponiendo dos clasesA
yB extends A
con el método dem
:SUPER(new B).m()
.fuente
Si bien se puede llamar al método de los padres por el prototipo del padre, usted tendrá que pasar la instancia actual del niño para usar
call
,apply
obind
método. Elbind
método creará una nueva función, por lo que no recomiendo que si le importa el rendimiento, excepto que solo se llama una vez.Como alternativa, puede reemplazar el método hijo y colocar el método padre en la instancia mientras llama al método hijo original.
fuente