2016-04-19 4 views
6

sto chiedendo come implementare la funzione virtuale nella javascript come C#, diciamofunzione virtuale in Javascript

  • Ho una classe base A
  • Ho anche una classe derivata denominata B
  • La classe A ha una funzione chiamata virtualFunction, questa dovrebbe essere una funzione virtuale come in C#, questa può essere sovrascritta nella classe derivata B
  • La funzione verrà chiamata per eseguire all'interno del costruttore della classe base, A. Se la funzione è sovrascritta in B, quella di B sarà invocata o ne verrà invocato uno A

Con questo esempio di seguito, voglio ottenere un avviso "B", non l''A'.

function A() { 
 
    this.virtualFunction(); 
 
} 
 

 
A.prototype.virtualFunction = function() { 
 
    alert('A'); 
 
}; 
 

 
//------------------------------------- 
 

 
function B() {} 
 

 
B.prototype = new A(); 
 
B.prototype.virtualFunction = function() { 
 
    alert('B'); 
 
}; 
 

 
var b = new B();

Se invochiamo la funzione dopo istanziato, in questo modo, allora va bene, ma ho bisogno "all'interno del costruttore"

var b = new B(); 
 
b.virtualFunction();

+2

Nel primo caso si ha 'alert ('A')' in entrambi padre e figlio funzioni – MysterX

+3

Anche in C#, un costruttore della classe base non ha accesso alle funzioni una classe derivata. Mentre il costruttore base è in esecuzione, l'oggetto non è ancora un'istanza della classe derivata, quindi il paradiso di override della classe derivata non è ancora stato impostato. In generale, non dovrebbe essere comunque sicuro chiamare i metodi nella classe derivata prima dell'esecuzione del costruttore derivato. – Wyzard

+0

[Non usare nuovo per creare oggetti prototipo!] (Https://stackoverflow.com/questions/12592913/quello-è-la-spiega-per-utilizzare-la-new-keyword-here) Invece, metti un super chiamata in 'B', e otterrai i risultati attesi. – Bergi

risposta

4

Quindi, la prima cosa da capire è che JavaScript non usa la stessa semantica di C#. Provare a farlo potrebbe causare dolore; stai molto meglio imparando come vanno le cose in JS. In effetti, la maggior parte della gente non cerca di fare un sacco di elementi di tipo ereditarietà in JS, ma preferisce invece la composizione (che in realtà è una best practice in tutti i linguaggi OO che conosco).

Detto questo, ci sono alcuni miglioramenti che potresti apportare al tuo codice.

function A() { 
 
    this.virtualFunction(); 
 
} 
 

 
A.prototype.virtualFunction = function() { 
 
    alert('A'); 
 
}; 
 

 
//------------------------------------- 
 

 
function B() { 
 
    A.call(this); 
 
} 
 

 
B.prototype = Object.create(A.prototype); 
 
B.prototype.constructor = B; 
 
B.prototype.virtualFunction = function() { 
 
    alert('B'); 
 
}; 
 

 
var b = new B();

+0

grazie Paul, è esattamente quello che voglio. Sono solo curioso di sapere perché dobbiamo avere il B.prototype.constructor = B; Va ancora bene se ho rimosso questa riga di codice. Quando è obbligatorio? – khoailang

+0

In caso contrario, il costruttore di B sarà A, poiché questo codice imposta tutto il prototipo di B su un clone del prototipo di A. A differenza di C#, la funzione 'costruttore' è solo un altro metodo sul prototipo. – Paul

+0

Ho contrassegnato come una risposta poiché è quello di cui ho bisogno, grazie. Tuttavia, puoi spiegare perché ho rimosso il B.prototype.constructor = B, che va ancora bene, funziona esattamente allo stesso modo, il "costruttore" B continua a essere colpito? Potete aiutarmi per un esempio che manca il B.prototype.constructor = B causa un errore? – khoailang