0

私は「フレームワーク」を開発しており、モジュールを作成していることに気づきました。

各モジュールには、共通の初期化規則のセットと関数の共通セットが存在します。

STEP 1. コンストラクター関数:

var ns = "namespace1";
t.scenarios[ns] = function (container, instanceName, options) {
    // common for all scenarios, e.g. options initialization
    t.core.defaultScenarioConstructor(this, ns, container, instanceName, options)

    // things only for NAMESPACE1
    this.PROPERTY1 = 1;
}

STEP 2. (質問関連) プロトタイプができました

var p = t.scenarios[ns].prototype;

p.newfunction = function(){
    this.PROPERTY1; // accessible
} 

THINGS_ONLY_FOR_NAMESPACE1 でいっぱいになります

t.core.defaultScenarioPrototype(p);

STEP 3 / 4. クラスのインスタンス化 (new キーワードを使用) & dom ビルダーの呼び出し

p.initNewView = function(container) {/* build dom and assign handlers*/}


ここで質問です...他の「コア」モジュール内で共通のコンストラクター/プロトタイプの初期化を行いたいと思います。STEP 2 で関数をプロトタイプに追加すると、"this" キーワードがあり、PROPERTY1 などの CURRENT_INTANCE フィールドにアクセスできます。

ただし、プロトタイプが「defaultScenarioPrototype」ビルダーに変数として渡される場合、すべての関数には、ビルダーが存在する CORE クラスの「this」がもう 1 つあります。
別のモジュールからプロトタイプに「共通」関数を追加するにはどうすればよいですか?

4

1 に答える 1

1

リクエストに応じて、コメントを回答として追加します。特定のコンテキスト内で関数を呼び出すには、Function.prototype.callFunction.prototype.applyまたはFunction.prototype.bindthisを使用できます。

Bind は、コールバックを渡し、クロージャーを使用したくない場合によく使用されます。

setTimeout(myOjbect.somefunction,100);//this in somefunction is window

setTimeout(function(){
  myObject.somefunction();
},100);//this in somefunction is myObject but a closure is created

setTimeout(myObject.somefunction.bind(myObject),100);//this is myObject 
                                    //and no closure is created

bind が使用するメモリが少なく、高速であると想定する人もいますが、最近どこかでバインドが実際にはクロージャを渡すよりも遅いことを読んだので、メモリ消費についてもわかりません。

于 2013-07-20T01:28:25.067 に答える