2013-08-02 7 views
5

私はEaselJSを使用してゲームを作成しています。デモファイルで使用されている継承パターンがどのように機能するかを誰かが説明できるかどうかは疑問です。具体的には、私は、次のファイルを探しています:... https://github.com/CreateJS/EaselJS/blob/master/examples/assets/Ship.js 7行目のEaselJS:誰かがデモで使用されている継承パターンについて説明できますか?

、船のプロトタイプがcreatejs.container()のインスタンスに設定されている

var p = Ship.prototype = new createjs.Container(); 

をして、行28、参照の上元のコンストラクタが格納されている:

p.Container_initialize = p.initialize; //unique to avoid overiding base class 

最後に、Shipオブジェクトは、ライン30

p.initialize = function() { 
    this.Container_initialize(); 
に初期化されます

私は過去に出会ったこととは違うので、私はこのパターンの周りに私の頭を包み込みたいです。なぜ、クラスのインスタンスを新しいクラスのプロトタイプとして使用したいのですか?多分、私はこのパターンの説明とのリンクを指摘するでしょうか?どんな助けがあっても大いに感謝しています...私はこの質問が少し曖昧だと思います。

+0

それは一般的なパターンですが、ここではhttps://developer.mozilla.org/チュートリアルをチェックen-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript – elclanrs

+0

ありがとう、それは私の質問にかなり答える。具体的には、「特殊化されたクラスは一般的に子と呼ばれ、他のクラスは一般に親と呼ばれます。JavaScriptでは、親クラスのインスタンスを子クラスに割り当ててから特殊化します。また、継承を実装するためにObject.createを使用してください。 " –

+0

これをすべて理解するには、EaselJSのTypescript定義ファイルを見てください。 –

答えて

8

私は過去に出会ったものとは違うので、私はこのパターンの周りを頭で囲んでいます。

ミューもありません。それはあまり魔法をしませんが、構造は間違いありません。正しいパターンについては、Correct javascript inheritanceを参照してください。

私はなぜ新しいクラスのプロトタイプとしてクラスのインスタンスを使用したいのですか?

あなたはありません。親クラスのプロトタイプオブジェクトから継承するオブジェクトを使用したいとします。 Unfortunately many people use new ParConstructor for that - コンストラクタ関数が空の場合にうまく動作します。コンストラクタがインスタンスのプロパティを作成したり、その他の副作用を起こしたりすると、問題が発生する可能性があります。しかし、ほとんどの人は気づいていないようです。

このパターンの説明は?

function Ship() { 
    this.initialize(); 
} 

これは単に(コンストラクタでthis)新しいインスタンスにinitializeメソッドを呼び出し

。初期化コードをコンストラクタに直接配置するよりも利点はありませんが、そうであれば可能です。

var p = Ship.prototype = new createjs.Container(); 

としては、これはContainer「クラス」からメソッドを継承するプロトタイプチェーンを設定され、上記で説明。不要なインスタンスの初期化が行われる可能性がありますので、Object.create呼び出しで置き換える必要があります。プロトタイプへのショートカット変数を作成します。ここで

// constructor: 
p.Container_initialize = p.initialize; //unique to avoid overiding base class 

、親のコンストラクタを明示的に参照が作成されます。 initializeプロパティはpで、プロトタイプのContainerプロトタイプから継承されています。pオブジェクトの独自のプロパティが作成されています。

p.initialize = function() { 
    this.Container_initialize(); 
    … // property init stuff 

が...ここに自分のinitializeメソッドは継承されたものをシャドウイング、プロトタイプオブジェクトに宣言されている...ので、それが必要とされています。それでも、「スーパー」初期化コードは、専用プロパティを使用して現在のインスタンスで呼び出すことができます。それを行うのはquitecommonですが、この方法ではこの方法ではありません。代わりに、callは、通常、子インスタンスに親コンストラクターを適用するために使用されます。

良い(少なくとも、より身近):initializeなし

function Ship() { 
    this.initialize(); 
} 

var super_p = createjs.Container.prototype, 
    p = Ship.prototype = Object.create(super_p); 

p.initialize = function() { 
    super_p.initialize.call(this); 
    … // property init stuff 

か、あるいは:

function Ship() { 
    createjs.Container.call(this); 
    … // property init stuff 
} 
Ship.prototype = Object.create(createjs.Container.prototype); 
+0

私はこれを投票しますが、私はそうする前にもう少し評判のポイントが必要です。あなたの深い説明をありがとう! –

関連する問題