2013-01-23 9 views
5

私はJavaScriptのプライベートスタティックメカニズムの仕組みを理解しています。しかしそのねじは の継承にあります。 例: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

「継承のねじ」とはどういう意味ですか?あなたが解決しようとしている問題は何ですか? – jfriend00

+1

いいえ、閉鎖です。ありがとう。 – adrian

答えて

4

まず、JavaScriptに「プライベート静的」というものはありません。ここで使用するものは、Immediately-Invoked Function Expressionによって作成される単純なクロージャです。

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

JavaScriptにはプロトタイプベースの継承モデルがあるため、プロトタイプとして使用できるオブジェクトを作成する必要があります。しかし、私は親クラスのコンストラクタを呼び出さずにこれを行うことをお勧めします(これは問題の2番目の部分を解決します)。これは、JavaScript世界のどこでも使われている非常に一般的なパターンです(Simple JavaScript Inheritance,、CoffeScriptなど)。非常に古いブラウザ(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を持つ親のコンストラクタを呼び出します。親コンストラクタは初期化を行い、子はそれを作業の分担とします。あなたの例では、親は期待どおりにカウンターをインクリメントします。

+0

Object.createは私にとって新しいものです:/ –