2010-04-21 18 views
10

Sto avendo qualche difficoltà a capire la clausola Se alla fine di questa funzione da Pro Patterns JavaScript design estendere:JavaScript eredità funzione

function extend(subClass, superClass) { 
    var F = function() {}; 
    F.prototype = superClass.prototype; 
    subClass.prototype = new F(); 
    subClass.prototype.constructor = subClass; 

    subClass.superclass = superClass.prototype; 
    if(superClass.prototype.constructor == Object.prototype.constructor) { 
     superClass.prototype.constructor = superClass; 
    } 
} 

Il libro spiega che queste linee in modo che l'attributo costruttore della superclasse è correttamente set, anche se la superclasse è la classe Object stessa. Eppure, se tralascio quelle tre righe e procedere come segue:

function SubClass() {}; 
extend(SubClass, Object); 

alert(Object.prototype.constructor == Object); 

L'avviso dice 'vero', il che significa che il costruttore della superclasse è impostato correttamente anche senza queste ultime tre righe. In quali condizioni, quindi, questa istruzione IF fa qualcosa di utile?

Grazie.

+0

Ho una domanda: perché la funzione di intermediario F, invece di subClass.prototype = new superClass() ;? – 755

risposta

14

Il problema che queste due linee cercano di evitare, è generalmente prodotto quando si sostituisce la proprietà prototype di una funzione di costruzione, ad esempio:

function Foo() {}; 
Foo.prototype = { 
    bar: 'baz' 
}; 

var foo = new Foo(); 
foo.constructor === Object; // true, but `constructor` should refer to Foo 

Quando functions objects are created, la proprietà prototype viene inizializzato con un nuovo oggetto , che contiene una struttura constructor che si riferisce alla funzione stessa, ad esempio:

function Bar() {}; 
var bar = new Bar(); 
bar.constructor === Bar; // true 

Quando si sostituisce la proprietà prototype con un altro oggetto, questo oggetto ha la sua proprietà constructor, generalmente ereditata da un altro costruttore o da Object.prototype.

var newObj = {}; 
newObj.constructor === Object; 

articoli consigliati:

+1

Questo lo risolve per me. Grazie. La spiegazione degli autori per questo codice è fuorviante. Dovrebbero aver detto che assicura che la superclasse non sia stata estesa in modo improprio. – Zach