2013-01-23 23 views
5

Capisco come funziona il meccanismo statico privato in javascript; ma quella vite nell'eredità . Per esempio:Statico privato in JavaScript ed Eredità

var Car = (function() { 
    var priv_static_count = 0; 
    return function() { 
     priv_static_count = priv_static_count + 1; 
    } 
})(); 
var SedanCar = function() {}; 
SedanCar.prototype = new Car(); 
SedanCar.prototype.constructor = SedanCar; 

C'è un modo per evitare questa trappola?

+4

Che cosa significa "viti nell'ereditarietà"? Qual è il problema che stai cercando di risolvere? – jfriend00

+1

No, è una chiusura. – adrian

risposta

4

Prima di tutto, non esiste una cosa come "statico privato" in JavaScript. Quello che usi qui è una chiusura semplice, che viene creata da un Immediately-Invoked Function Expression.

La tua domanda non è abbastanza chiara, ma suppongo che tu voglia contare le istanze Car che sono state create, e non funziona, perché quando installi la sottoclasse il contatore non aumenterà (problema 1). Invece, il contatore viene incrementato una sola volta, quando si definisce la sottoclasse (problema 2).

Poiché JavaScript ha un modello di ereditarietà basato su prototipo, è necessario creare un oggetto che può essere utilizzato come prototipo. Ma ti suggerisco di farlo senza chiamare il costruttore della classe genitore (questo risolverà la seconda parte del problema). Questo è un pattern molto comune utilizzato ovunque nel mondo JavaScript (vedere Simple JavaScript Inheritance, Backbone, CoffeScript, ecc.) Ed è molto semplice da implementare se non è necessario supportare browser molto vecchi (IE6-8). Funziona così:

SedanCar.prototype = Object.create(Car.prototype) 

Ora la prima parte del problema è abbastanza semplice da risolvere. Basta chiamare il costruttore genitore ogni volta che il bambino viene istanziato. Questo è anche un modello abbastanza buono ed è incorporato in molti altri linguaggi (Java, ecc.). In JavaScript, sarà necessario farlo manualmente, in questo modo:

var SedanCar = function() { 
    // Parent class initialization 
    Car.call(this /*, and, other, arguments, to, the, parent, constructor */) 

    // Child class initialization 
}; 

Ciò chiamare il costruttore genitore con this legato al nuovo oggetto creato. Il costruttore padre esegue l'inizializzazione e quindi il figlio fa parte del lavoro. Nel tuo esempio, il genitore incrementerà il contatore come ti aspetteresti.

+0

grazie. Object.create è qualcosa di nuovo per me: / –