0

コードを整理するためにネストされた名前空間を設定したいと思います。この記事で説明されているプラ​​グインのような構造に従おうとしています。this.error_msg問題は、私の例でアクセスする方法がわからないことです。これを正しく設定しましたか?jQueryを使用する必要がありますか.extend、それとも.prototypeアクセスする必要がありますthis.error_msgか?

(function(TC, $, undefined){

    TC.ajax = function() {
        this.error_msg = 'default error...';         
    };

    TC.ajax.run = function(){
        //do stuff...
        TC.ajax.handle_error();
    };

    TC.ajax.handle_error = function(){
        alert(this.error_msg);
    };        

}(window.TC = window.TC || {}, jQuery));

// Test it
TC.ajax.run();

デモ: http: //jsfiddle.net/g99yt/

4

5 に答える 5

3

コードは次のようになっている必要があると思います。

(function(TC, $, undefined){
    _this = this;
    TC.ajax = function() {
        _this.error_msg = 'default error...';         
    };

    TC.ajax.run = function(){
        //do stuff...
        TC.ajax.handle_error();
    };

    TC.ajax.handle_error = function(){
        alert(_this.error_msg);
    };        

}(window.TC = window.TC || {}, jQuery));

// Test it
TC.ajax.run();
于 2013-03-14T19:29:53.143 に答える
3

覚えておくべき重要なことはfunction()、を使用するたびに、新しいスコープを作成しているということです。したがって、そのスコープで定義していないために未定義のTC.ajax.handle_errorメソッドでそれを確認できます。this.error_msg実行できることの1つは、これらのメソッドがajaxオブジェクトに関連していることを確認し、オブジェクトの新しいインスタンスを宣言してから、その上でメソッドを呼び出すプロトタイプを作成することです。下記参照 :

(function(TC, $, undefined){

    TC.ajax = function() {
        this.error_msg = 'default error...';         
    };

    TC.ajax.prototype.run = function(){
        //do stuff...
        this.handle_error.call(this);
    };

    TC.ajax.prototype.handle_error = function(){
        alert(this.error_msg);
    };        

}(window.TC = window.TC || {}, jQuery));

// Test it
 var ajaxInstance = new TC.ajax();

ajaxInstance.run();

フィドル

@ktaのようにローカルグローバル変数を保持したり、call関数を介してスコープを設定したりするなど、他のオプションもありますが、それは実際には構造にうまく適用されません。

于 2013-03-14T19:37:16.283 に答える
0

これは実際には一般的な問題であり、何thisを指しているのかすぐにはわかりません。だから説明する:

TC.ajax.handle_error = function(){
    alert(this.error_msg);
};   

this関数内は、オブジェクトTC.ajax.handle_errorではなく関数を参照しTCます。TCしたがって、後で参照できるように、への参照を保存するだけです。

var _this = this;

...
_this.error_msg = 'default error....';
...

TC.ajax.handle_error = function(){
     alert(_this.error_msg);
 };        
于 2013-03-14T19:38:39.183 に答える
0

TC.ajaxコンストラクターであると想定される場合は、プロトタイプに追加する必要がありますrun()handle_error()

しかし、あなたは次のようなことをすることができます

TC.ajax = {};    
TC.ajax.error_msg = 'default error...'; 

あなたの場合、あなたが電話をするとすぐにerror_msgに割り当てられますが、これは決して起こりません。そしてそれでも、を参照します。そして、が呼び出されたとき、を参照します。thisTC.ajax()thisTCTC.ajax.handle_error()thisTC.ajax

于 2013-03-14T19:38:50.267 に答える
0

これは私が使用することになったものです:

(function ($, TC, undefined) {

    TC.nestedNamespace = TC.nestedNamespace || {};

    //add a public function to our new namespace 
    TC.nestedNamespace.test = function () {        
       console.log("Winning!");    
    };

}(jQuery, window.TC = window.TC || {}));

TC.nestedNamespace.test();

JSFiddleの例。関連記事のコメントでこの方法を見つけました。

于 2013-07-11T23:18:33.640 に答える