2013-01-23 17 views
5

Ich verstehe, wie private statische Mechanismus in Javascript funktioniert; aber das Schrauben in Vererbung. Zum Beispiel:Private statische in JavaScript und Vererbung

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; 

Gibt es eine Möglichkeit, diese Gefahr zu vermeiden?

+4

Was bedeutet "Schrauben in Vererbung"? Was ist das Problem, das du lösen willst? – jfriend00

+1

Nein, es ist eine Schließung. – adrian

Antwort

4

Zunächst einmal gibt es in JavaScript keine "private static". Was Sie hier verwenden, ist ein einfacher Verschluss, der von einer Immediately-Invoked Function Expression erstellt wird.

Ihre Frage ist nicht ganz klar, aber ich denke, Sie möchten die Car-Instanzen zählen, die erstellt wurden, und es funktioniert nicht, da der Zähler beim Instanziieren der Unterklasse nicht erhöht (Problem 1). Stattdessen wird der Zähler nur einmal inkrementiert, wenn Sie Ihre Unterklasse definieren (Problem 2).

Da JavaScript ein prototypbasiertes Vererbungsmodell hat, müssen Sie ein Objekt erstellen, das als Prototyp verwendet werden kann. Aber ich schlage vor, dass Sie es tun, ohne den Konstruktor der Elternklasse aufzurufen (das wird den zweiten Teil des Problems lösen). Dies ist ein sehr häufiges Muster, das überall in der JavaScript-Welt verwendet wird (siehe Simple JavaScript Inheritance, Backbone, CoffeScript usw.), und es ist sehr einfach zu implementieren, wenn Sie nicht sehr alte Browser (IE6-8) unterstützen müssen. Es geht so:

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

Jetzt ist der erste Teil des Problems ziemlich einfach zu beheben. Rufen Sie den übergeordneten Konstruktor jedes Mal auf, wenn das Kind instanziiert wird. Dies ist auch ein ziemlich gutes Muster, und es ist in vielen anderen Sprachen (Java, etc.) eingebaut. In JavaScript, müssen Sie es manuell tun, wie folgt aus:

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

    // Child class initialization 
}; 

Dies wird den Eltern Konstruktor mit this auf das neu erstellte Objekt gebunden nennen. Der übergeordnete Konstruktor führt die Initialisierung aus, und dann übernimmt das untergeordnete Element die Arbeit. In Ihrem Beispiel erhöht der Elternteil den Zähler wie erwartet.

+0

danke. Object.create ist etwas neues für mich: / –

Verwandte Themen