2012-06-19 9 views
6

En C#, tenemos un concepto sobre el método abstracto y cómo aplicarlo en Javascript. Ejemplo, tengo un ejemplo:Cómo aplicar la función virtual en javascript

function BaseClass() { 
    this.hello = function() { 
     this.talk(); 
    } 
    this.talk = function() { 
     alert("I'm BaseClass"); 
    } 
}; 

function MyClass() { 
    this.talk = function() { 
     alert("I'm MyClass"); 
    } 
    BaseClass.call(this); 
}; 

MyClass.prototype = new BaseClass(); 

var a = new MyClass(); 
a.hello();​ 

cómo la función hello() en BaseClass llamar a la función do() desde MyClass cuando el objeto es una instancia de MyClass. El resultado de alerta debe ser "I'm MyClass". Por favor, ayúdame. Gracias.

+2

Creo que quiso decir 'virtual' /' anular', no 'abstracto'. – HackedByChinese

+0

Sí, la función de la base debe ser una función virtual para que la clase heredada pueda anularla. –

+0

No estoy seguro de entender. Simplemente elimine la línea 'BaseClass.call (this);' y funciona, ya que 'this.talk = ...' prevalece sobre el método base. O puede iniciar 'MyClass' con' BaseClass.call (...) '(al principio, no al final). Pero si usa 'call', entonces no hay necesidad de definir el prototipo. – freakish

Respuesta

7

Es posible que desee llamar al constructor "base" primero:

function MyClass() { 
    BaseClass.call(this); 
    this.talk = function() { 
     alert("I'm MyClass"); 
    } 
} 

lo contrario BaseClass.talk se sobreponen a MyClass.talk.

Como nota al margen, usar el concepto de "clases" en javascript es bastante contraproducente, porque así no es como funciona este lenguaje. JS usa herencia prototípica, es decir, deriva nuevos objetos de otros objetos, no de "clases". Además, cada función en JS es "virtual" en sentido C++, porque su puntero this depende de cómo se llama a la función, no de dónde está definida.

4

está sustituyendo su función haciendo BaseClass.call(this);

function MyClass() { 
    //BaseClass.call(this); // Not really necessary unless you run code inside your base class 
    this.talk = function() { 
     alert("I'm MyClass"); 
    } 
}; 

Esto haría su trabajo código. El MyClass.prototype = new BaseClass(); debe hacer que la función hello esté disponible en su objeto a.

4

El problema es que realmente está definiendo métodos de instancia privados, tanto en el MyClass como en el BaseClass constructores. Esto anula la búsqueda de método prototipo, ya que los métodos talk no se encuentran en el prototipo sino que son propiedades de instancia reales, y el constructor BaseClass se invoca después del constructor MyClass, sobrescribiendo así la propiedad talk.

Demonstration con herencia de prototipo real.

Cuestiones relacionadas