2017-02-08 5 views
0

は、私は以下のように定義されているコンテキスト機能タイプ持って作成されます。それは定義の中で明らかなようにJavaScript関数が

var Context = function() { 

    this.run = function() { 
     method1(); 
     method2(); 
    } 

    var method1 = function() { 
    } 
} 

を、法2は、コンテキストで定義されていません。私はContextのすべてのインスタンスがこのメソッドの実装を渡す必要があります。

var c = new Context(); 

// This does not work! because the call in run() function 
// is not this.method2(); 

c.method2 = function() { 
    alert("injected method2"); 
}; 

c.run(); 

Iはを使用せずラン方法2()を維持するために必要このオブジェクト即ちthis.method2()。

+0

なぜあなたは、パラメータとしてコールバック関数を使用していないにする必要があるでしょうか? – laser

答えて

1

あなたはそれが何の問題も動作しませんContextを作成する前method2を定義することができた場合:

function method2() { 
    alert(2); 
} 

var c = new Context(); 
c.run(); 
+0

私の答えは、基本的に@Stephan Bijzitterに相当することに注意してください。なぜなら、関数を定義するグローバルスコープでは、それを 'window 'スコープに(ホイストして)添付するからです。彼の答えはあなたが言うなら、Reactモジュールの中では動作しません。 –

+0

私の問題を解決していただきありがとうございます。実際には、すべての競合を避けるために、すべてを自己呼び出し関数に入れることができます。 – Hasan

+0

これを定義する必要はありませんが、巻き上げによって利用できるようになります。 –

1

cオブジェクトの代わりにwindowオブジェクトにmethod2を追加することができます。

これはデザインが不良であることを明確に示しています。おそらくこれを別の方法で調べるべきです。

0

コールバックアプローチ:

var Context = function (callback) { 

    this.run = function() { 
     method1(); 
     if(callback) callback(); 
    } 

    var method1 = function() { 
    } 
} 

var c = new Context(function() { 
    alert("injected method2"); 
}); 

c.run(); 
+0

** Context **の定義を変更しました。 – Hasan

+0

@ハサンプロトタイプを追加したいのですか? Context.prototype.method2 = function(){}? http://stackoverflow.com/questions/13521833/javascript-add-method-to-object – laser

0

をあなたのrunメソッドが期待どおりに動作するはずです以下に変更した場合は

this.run = function() { 
    method1(); 
    this.method2(); 
} 

UPDAT E:私は、Contextオブジェクトのすべてのインスタンスでこれを実行できるようにしたいと思っています。その場合、あなたはまたContext.prototypeに法2を定義していないだけでc

Context.prototype.method2 = function() { 
    console.log("injected method2dfd"); 
}; 
+0

私は明示的に言いましたが、私はその質問でそれをしたくありません。 – Hasan