¿Es posible llamar al método base desde un método prototipo en JavaScript si se ha anulado?
MyClass = function(name){
this.name = name;
this.do = function() {
//do somthing
}
};
MyClass.prototype.do = function() {
if (this.name === 'something') {
//do something new
} else {
//CALL BASE METHOD
}
};
javascript
prototype
overriding
markvpc
fuente
fuente
Respuestas:
No entendí qué es exactamente lo que está tratando de hacer, pero normalmente la implementación de un comportamiento específico del objeto se realiza de la siguiente manera:
fuente
Bueno, una forma de hacerlo sería guardar el método base y luego llamarlo desde el método anulado, así
fuente
_do_base
almacena una referencia a cualquier función definida anteriormente. Si no hubiera ninguno, entonces lo seríaundefined
. JavaScript no lo es: lasmake
expresiones nunca se evalúan perezosamente como usted sugiere que lo son. Ahora, si el prototipo que se hereda también usó _do_base para almacenar lo que cree que es la implementación de su tipo basedo
, entonces tiene un problema. Entonces, sí, un cierre sería una forma mejor y segura de heredar para almacenar la referencia a la implementación de la función original si se usa este método, aunque eso requeriría usarloFunction.prototype.call(this)
.Me temo que su ejemplo no funciona como usted piensa. Esta parte:
sobrescribe la definición de
Dado que el objeto recién creado ya tiene una propiedad "do", no busca la cadena de prototipos.
La forma clásica de herencia en Javascript es torpe y difícil de entender. Sugeriría usar el patrón de herencia simple Douglas Crockfords en su lugar. Me gusta esto:
En mi opinión, una forma mucho más clara de manejar objetos, constructores y herencia en javascript. Puedes leer más en Crockfords Javascript: Las partes buenas .
fuente
base_do
como una función, porque de esa manera se pierde cualquierthis
enlace en eldo
método original . Por lo tanto, la configuración del método base es un poco más compleja, especialmente si desea llamarlo utilizando el objeto base enthis
lugar del objeto secundario. Sugeriría algo parecidobase_do.apply(me, arguments)
.var
parabase_do
? ¿Es esto a propósito y, de ser así, por qué? Y, como dijo @GiulioPiancastelli, ¿esta rupturathis
vinculantebase_do()
o esa llamada heredaráthis
de su llamador?var
debería estar allí. El uso decall
(oapply
) nos permite vincularthis
correctamente.Sé que esta publicación es de hace 4 años, pero debido a mi experiencia en C #, estaba buscando una manera de llamar a la clase base sin tener que especificar el nombre de la clase, sino obtenerla mediante una propiedad en la subclase. Entonces, mi único cambio en la respuesta de Christoph sería
De esto:
A esto:
fuente
this.constructor
puede que no siempre apunteMyClass
.si define una función como esta (usando OOP)
Hay dos formas de llamar a una función prototipo: 1) hacer una instancia y llamar a la función objeto
y la otra forma es ... 2) está llamando a la función directamente desde el prototipo:
fuente
Esta solución usa
Object.getPrototypeOf
TestA
es super que tienegetName
TestB
es un hijo que anulagetName
pero también tienegetBothNames
que llama tanto lasuper
versióngetName
como lachild
versiónfuente
fuente
Una alternativa :
fuente
__proto__
que debe evitarse el uso (que cambia el [[Prototipo]] `de un objeto). Utiliza laObject.create(...)
ruta en su lugar.Si entiendo correctamente, desea que la funcionalidad de Base se realice siempre, mientras que una parte de ella debe dejarse a las implementaciones.
Es posible que reciba ayuda del patrón de diseño ' método de plantilla '.
fuente
Si conoce su superclase por su nombre, puede hacer algo como esto:
Esto imprimirá
como se esperaba.
fuente
Otra forma con ES5 es atravesar explícitamente la cadena del prototipo usando
Object.getPrototypeOf(this)
fuente
No, necesitaría asignar diferentes funciones a la función do en el constructor y a la función do en los prototipos.
fuente
Además, si desea anular todas las instancias y no solo esa instancia especial, esta podría ayudar.
resultado:
fuente
fuente