2013-06-06 10 views
5

ho istituito una classe base di serie:Javascript classe Ereditarietà per le funzioni

MyBase = function() { 
    this.m_Stuff = 0; // etc 
}; 
MyBase.prototype.MySuperFunction = function (arg1) { 
    alert("Hello" + arg1); 
}; 

Poi ho impostato un'altra classe che eredita myBase

MyChild = function() { 
    MyBase.call(this); 
    this.m_OtherStuff = 1; // etc 
}; 
MyChild.prototype = new MyBase(); // innherit 

Ma poi (e questo è il bit I non so come fare) Voglio scavalcare MySuperFunction di MyBase con uno migliore, ma chiamando la funzione della classe base nel processo:

La classe figlio che desidera eseguire l'override è la funzione della classe base, ma desidera chiamare la funzione della classe base nella nuova definizione migliorata.

È possibile, e se sì, come può essere fatto?

+0

solo per chiarire, quindi stai dicendo MyBase.prototype.MySuperFunction deve avvisare "Sei un" + arg2 + "'idiota del livello" o stai solo provando a invocarlo nel contesto del metodo della classe figlio? – chrisvillanueva

+0

Voglio che la mia classe figlia chiami la funzione della classe base prima di aggiungere la propria modifica. – Rewind

risposta

2

seguire le seguenti: -

MyBase.prototype.MySuperFunction.call(this, arg1); 
+0

Quindi per chiarire, stai dicendo che la funzione di mio figlio sarà MyChild.prototype.MySuperFunction = function (arg1, arg2) {MyBase.prototype.MySuperFunction.call (this, arg1); alert ("Sei un" + arg2 + "'idiota di livello th"); }; Inoltre, quando ho impostato un'istanza altrove; var mychild = new MyChild(); Chiamerei quindi la versione della funzione di CHILD con: mychild.MySuperFunction ("Dave", "7"); – Rewind

+0

sì, assolutamente – pvnarula

8

E 'simile alla chiamata nel costruttore ereditato. È possibile accedere al metodo "super" ancora in MyBase.prototype.MySuperFunction (dove è stato assegnato esso), in modo da utilizzare:

MyBase.prototype.MySuperFunction.call(this, arg1); 

Per un approccio più dinamico ancora possibile utilizzare Object.getPrototypeOf per ottenere il prototipo, ma attenzione che funziona con eredità dinamica. E se hai molti metodi che devono chiamare i loro genitori, può essere utile l'alias MyBase.prototype come variabile super che è accessibile a tutte le funzioni sull'oggetto prototipo Child (vedi this answer per un esempio)).

+0

Quindi per chiarire, stai dicendo che la funzione di mio figlio sarà MyChild.prototype.MySuperFunction = function (arg1, arg2) {MyBase.prototype.MySuperFunction.call (this, arg1); alert ("Sei un" + arg2 + "'idiota di livello th"); }; – Rewind

+0

@JonAshman: Sì, esattamente. – Bergi

+0

@Bergi c'è un modo per chiamare questa cosa prototipo * entro * la dichiarazione originale della funzione/oggetto? questo [gist] (https://gist.github.com/abbood/10108937) fornisce un esempio di cosa sto parlando di – abbood

Problemi correlati