2014-04-23 12 views
5

Perché goog.inherits dalla chiusura Biblioteca di Google simile a questa:Perché creare un costruttore temporaneo quando si esegue l'ereditarietà Javascript?

goog.inherits = function(childCtor, parentCtor) { 
    function tempCtor() {}; 
    tempCtor.prototype = parentCtor.prototype; 
    childCtor.superClass_ = parentCtor.prototype; 
    childCtor.prototype = new tempCtor(); 
    childCtor.prototype.constructor = childCtor; 
}; 

piuttosto che

goog.inherits = function(childCtor, parentCtor) { 
    childCtor.superClass_ = parentCtor.prototype; 
    childCtor.prototype = new parentCtor(); 
    childCtor.prototype.constructor = childCtor; 
}; 

Quali benefici vuol tempCtor fornire?

+0

Entrambi aggiungono un oggetto inutile nella catena di ereditarietà di istanze di * childCtor *. Nel primo caso, quell'oggetto è un oggetto funzione vuoto. Nel secondo, è un'istanza completa * parentCtor *. Quindi il primo può essere visto come più efficiente (sebbene crei una nuova funzione vuota ogni volta, mentre solo uno è necessario). – RobG

+0

ecco una lettura interessante - http://bolinfest.com/javascript/inheritance.php – dekdev

risposta

5

Se parentCtor aveva un codice di inizializzazione e nel caso peggiore in attesa di alcuni argomenti, il codice potrebbe non riuscire in modo imprevisto. Ecco perché creano una funzione fittizia e ne ereditano.

2

Per quanto riguarda l'utilizzo di riferimenti a istanze di oggetti letterali, è il disaccoppiamento del prototipo di childCtor dall'istanza effettiva del prototipo di parentCtor mediante l'inserimento di un'altra istanza di funzione.

1

thefourtheye praticamente risponde alla domanda. Il primo è visto come un po 'più efficiente, ma può essere reso più efficiente se viene creato un solo costruttore temporaneo durante l'inizializzazione, non uno su ogni invocazione di eredita:

goog.inherits = (function() { 
    function tempCtor(){} 
    return function(childCtor, parentCtor) { 
    tempCtor.prototype = parentCtor.prototype; 
    childCtor.superClass_ = parentCtor.prototype; 
    childCtor.prototype = new tempCtor(); 
    childCtor.prototype.constructor = childCtor; 
    }; 
}()); 

dubito che la differenza è misurabile , ti dà solo un caldo bagliore interno per risparmiare un paio di cicli CPU e byte di memoria di volta in volta.

Problemi correlati