1

ClassAのプロパティをClassBに「コピー」または「実装」するいくつかの大規模なプロジェクトでこのJavaScriptパターンを確認しましたが、「。call()」を使用してClassBのコンストラクター内でClassAの空のコンストラクターを呼び出す目的を理解できませんでした。 「this」バインディングとしてのClassBインスタンス?

var ClassA = function() {
    //this function is totally empty
};

ClassA.prototype = {
    jump: function() {...some code...},
    dance: function() {
        if (this.canDance) {
            alert("dance");
        }
    }
};

ClassA.implementOn = function(targetClassOrObject) {
    for ( var prop in ClassA.prototype ) {      
        targetClassOrObject[ prop ] = ClassA.prototype[ prop ];
    }
};

var ClassB = function() {
    this.canDance = true;
    ClassA.call(this);          // <------------What's the purpose of this line?
};

ClassA.implementOn(ClassB.prototype);

var instanceOfB = new ClassB();
instanceOfB.dance();
4

4 に答える 4

2

ClassAコンストラクターが空の場合、ここで大きな驚きはありませんcall。ingClassAの空のコンストラクターはまったく何もしません。

ClassAただし、のコンストラクターを空にしないことを決定した瞬間に、その行が非常に重要な効果を持っていることがわかります。オブジェクトを作成すると、新しく作成されたオブジェクトのコンテキストで特定のコンストラクターの動作ClassBも呼び出されます。がの論理的な「サブクラス」である場合に期待するものです。ClassAClassBClassBClassA

(もちろん、JavaScriptには適切な「サブクラス」がありませんが、これは明らかに、言語でクラスベースの動作を実装する試みです。)

于 2013-02-12T17:19:20.693 に答える
1

「.call()」を使用してClassBのコンストラクター内でClassAの空のコンストラクターを呼び出す目的

ClassA空にならないときにスクリプトを引き続き機能させるため。もちろん、現在は何もしていませんが、将来変更される可能性があります。したがって、完全な継承パターンを実装して、バグを発生させることなく後でコードを簡単に変更できるようにすることをお勧めします。

ClassAコンストラクターで設定されたカスタムインスタンス固有のプロパティを実装するように変更したら、それらをClassBインスタンスにも設定する必要があります。ClassAしたがって、インスタンスの初期化中にもインスタンスでコンストラクターを呼び出しClassBます。

于 2013-02-12T17:18:27.367 に答える
1

コンストラクターが空の場合ClassA(サンプルコードのように)、そうです、何もしません。

ただし、このパターンが表示される理由は、そうでない場合のためです。superこれは、クラスベースのオブジェクト指向言語での呼び出しに似ています。

正しい状態のオブジェクトを取得するためにコンストラクターで何らかの作業を行う必要がある場合ClassAは、「サブクラス」で同じ作業を行うことをお勧めします。プロトタイプのプロパティをコピーするだけでは不十分な場合があります。

于 2013-02-12T17:19:24.363 に答える
0

を使用すると、呼び出されたメソッド.callのの値thisを指定した引数に変更できます。 コンテキストとしてコンストラクターをClassA.call(this)呼び出します。これにより、 inメソッドのプロパティを使用できます。メソッドはすべてviaにコピーされます。ClassAClassBClassBClassAClassBClassA.implementOn

(new ClassA()).dance()あなたはそれが何もしないことに気付くでしょう、しかし本当なので(new ClassB()).dance()警告します。"dance"this.canDance

デモ: http: //jsfiddle.net/5v7xh/

于 2013-02-12T17:18:10.557 に答える