2013-06-04 14 views
6

Professionale JavaScript per gli sviluppatori web, terza edizione di Nicholas C. Zakas (Wrox, 2012, p.210-215 descrive "Parassita Inheritance Combination" usando la seguente funzione:"parassita Combinazione Inheritance" in Professionale JavaScript per gli sviluppatori web

.
function inheritPrototype(subType, superType) { 
    var prototype = object(superType.prototype); 
    prototype.constructor = subType; 
    subType.prototype = prototype; 
} 

devo ancora capire che cosa l'assegnazione del sottotipo al prototype.constructor fa o dovrebbe fare meno che non mi manca qualcosa, l'uscita ottengo utilizzando il codice di esempio è lo stesso:

Senza "augment object" (prototype.constructor = subType;) in inheritPrototype: http://jsfiddle.net/Q22DN/

Con "aumentare oggetto" (prototype.constructor = subType;) in inheritPrototype http://jsfiddle.net/eAYN8/

questo può davvero essere una riga di codice senza scopo? Grazie per la tua spiegazione!

risposta

3

L'assegnazione a "costruttore" non è obbligatoria poiché l'assegnazione a "prototype" è. La ragione per farlo è che i prototipi di funzione di solito vengono forniti con la proprietà "costruttore" impostata di default. Potrebbe essere utile per le librerie che copiano oggetti poiché è possibile ottenere un riferimento al costruttore dell'oggetto dall'oggetto stesso.

function Foo(){ 
} 

obj = new Foo(); 

console.log(obj.constructor); //function Foo 
+0

v'è alcuna ragione per preferisci questo modello a goog.inherits? http://docs.closure-library.googlecode.com/git/closure_goog_base.js.source.html#line1466 Mi piace come imposta 'superClass_' in child in modo da poter sovrascrivere i metodi parent e continuare a chiamarli da un bambino. – HMR

+0

@HMR: diversi modelli di ereditarietà tendono a funzionare meglio con caratteristiche diverse (come interagire con classi "regolari", se è possibile gestire più ereditarietà, variabili private o protette, super, ecc.). Personalmente, tendo a programmare in uno stile più "funzionale", quindi in realtà non uso molte di queste classi e quando le uso la gerarchia è di solito molto piatta, quindi la superclasse e l'ereditarietà non finiscono per importare molto. – hugomg

+0

Sia missingno che Givi sono corretti in quanto l'assegnazione al costruttore non è obbligatoria e senza di essa il costruttore di istanze subType (o child) === SuperType, e resettandolo su SubType renderà le informazioni disponibili in seguito. Forse questo è tutto ciò che c'è da fare. Grazie! –

2

Demo si sovrascrive prototipo costruttore in modo da perdere SubType.prototype.constructor e se si vuole poi sapere costruttore dell'oggetto si dovrebbe impostare esplicitamente ...

function object(o){ 
    function F(){} 
    F.prototype = o; 
    return new F(); 
} 

function inheritPrototype(subType, superType) { 
    var prototype = object(superType.prototype); 
    prototype.constructor = subType; //if omit (new SubType()).constructor === superType 
    subType.prototype = prototype; 
} 

function SuperType(name){ 
    this.name = name; 
} 

function SubType(name, age){ 
    SuperType.call(this, name); 
    this.age = age; 
} 

inheritPrototype(subType, superType); 
+0

Dove viene creato l'oggetto con 'new F();' quale alias di un'istanza vuota di 'SuperType' go? Sarà ancora allocato nello heap, giusto? Pertanto quando accedo alla proprietà name 'var sub = new Sottotipo (" Nome ", 16); console.log (sub.name) 'viene effettuata una ricerca prototipo e la catena di prototipi viene scalata e anche l'istanza di F è nella catena? Se scrivo 'sub .__ proto__' tuttavia ottengo' SubType {} 'e non' F {} 'come prototipo ... Dov'è andato F? – tonix

Problemi correlati