5

プライベート静的メカニズムがjavascriptでどのように機能するかを理解しています。しかし、それは継承をねじ込みます。例えば:

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;

この落とし穴を回避する方法はありますか?

4

1 に答える 1

4

まず第一に、JavaScriptには「プライベートスタティック」のようなものはありません。ここで使用するのは、即時呼び出し関数式によって作成される単純なクロージャーです。

あなたの質問は明確ではありませんが、作成されたCarインスタンスを数えたいと思いますが、サブクラスをインスタンス化するとカウンターが増加しないため、機能しません(問題1)。代わりに、サブクラスを定義するときに、カウンターは1回だけインクリメントされます(問題2)。

JavaScriptにはプロトタイプベースの継承モデルがあるため、プロトタイプとして使用できるオブジェクトを作成する必要があります。ただし、親クラスのコンストラクターを呼び出さずに実行することをお勧めします(これにより、問題の2番目の部分が解決されます)。これはJavaScriptの世界で使用される非常に一般的なパターンであり(Simple JavaScript InheritanceBackboneCoffeScriptなどを参照)、非常に古いブラウザー(IE6-8)をサポートする必要がない場合は実装が非常に簡単です。こんなふうになります:

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

これで、問題の最初の部分を修正するのは非常に簡単です。子がインスタンス化されるたびに、親コンストラクターを呼び出すだけです。これも非常に優れたパターンであり、他の多くの言語(Javaなど)に組み込まれています。JavaScriptでは、次のように手動で行う必要があります。

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

    // Child class initialization
};

thisこれにより、新しく作成されたオブジェクトにバインドされた親コンストラクターが呼び出されます。親コンストラクターが初期化を行い、次に子コンストラクターが作業の分担を行います。あなたの例では、親はあなたが期待するようにカウンターをインクリメントします。

于 2013-01-23T13:25:24.600 に答える