2

私はいくつかの「モジュール」を備えたアプリを構築しています。各モジュールには同様の基本セットの機能が必要なので、各モジュールがプロトタイプの継承を介して継承する基本モジュールを作成しました。基本モジュールの関数名のいくつかは非常に長く、これらの関数は頻繁に使用されるため、各モジュール内で短い名前を割り当てたいのですが、これにより、「this」の値をDOMWindowと等しく設定する際に問題が発生します。

以下のコードを参照してください。

var SAMPLEAPP = SAMPLEAPP || {};

//This is a base module that I want all other modules to inherit from
SAMPLEAPP.Module = function(){

};

SAMPLEAPP.Module.prototype.someLongFunctionName = function(){
    console.log(this);
};


//This is a module that inherits from the base module
SAMPLEAPP.RouterModule= function(){
    var shortName = this.someLongFunctionName;

    //This correctly logs 'SAMPLEAPP.RouterModule', but I would rather not type 
    //out this long function name each time I need to use the function
    this.someLongFunctionName();

    //However, this code logs 'DOMWindow' when I would expect the value of 'this' 
    //to be the same as the direct call to this.someLongFunctionName
    shortName();
};

SAMPLEAPP.RouterModule.prototype = new SAMPLEAPP.Module();


new SAMPLEAPP.RouterModule();

私の質問:shortName()を呼び出すとSAMPLEAPP.RouterModuleがログに記録されるようにコードを変更するにはどうすればよいですか?可能であれば、shortNameの実際の呼び出しではなく、モジュールの定義方法を変更したいと思います(つまり、shortname.call(this)は、someLongFunctionNameのエイリアスを作成する目的を無効にします)

4

4 に答える 4

2

他の人が述べたように、callorを使用できますapply(どちらでも機能します。違いは、引数が関数に渡される方法だけです)。

または、コンテキストを関数にバインドするES5bindメソッドを使用できます (この場合、コンテキストは になりますthis)。

var shortName = this.someLongFunctionName.bind(this);

shortNameその後、通常どおりに呼び出すことができます。

shortName();

これが実際のです。MDN 記事の最も関連性の高い部分は次のとおりです。

bind() 関数は、呼び出される関数 (バインドされた関数のターゲット関数) と同じ関数本体 (ECMAScript 5 用語の内部 Call 属性) を持つ新しい関数 (バインドされた関数) を作成します。オーバーライドできない bind() の最初の引数。

于 2012-05-08T17:52:30.157 に答える
1

call / apply関数を使用して、「this」コンテキストをメソッド呼び出しに渡すことができます。あなたの場合、それはどちらかです

shortName.apply(this);

また

shortName.call(this);
于 2012-05-08T17:50:06.703 に答える
1

別の解決策は、バインディング関数を使用して新しいコンテキストを関数にバインドすることです。

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind

var shortName = this.someLongFunctionName.bind(this);
于 2012-05-08T17:53:40.697 に答える
0

呼び出しをshortName();に変更できますshortName.call(this);

これはjavascriptはちょっとしたトリックです。コンテキストに基づいています。

于 2012-05-08T17:50:00.527 に答える