2012-01-09 22 views
1
var plugin = { 
    Init: function() { 
     this.UpdateUI(); 
     if (this.Status() == 1) { 
      ... 
     } else { 
      ... 
     } 
    }, 
    Status: function() { 
     ... 
    }, 
    UpdateUI: function() { 
     ... 
    } 
} 

これは基本コードです。問題は、initが呼び出されたときに、次のエラーが表示され、次のとおりです。オブジェクト関数は関数ではありません

this.UpdateUI is not a function 
this.Status is not a function 

誰かが私のコードに問題が何を教えてもらえますか?

+2

'Init()'を呼び出すコードを投稿できますか? –

+0

スコープの問題、 'this'はプラグインを参照していないので、init関数を参照しています。 Status関数とUpdateUI関数をinit関数内に配置した場合、コードは正しく動作します。私はバルディールがあなたに正しい解決策を持っていると思う。 –

+0

私はちょうどJavaScriptの醜い側面の1つを見つけたと思うし、私の答えの投票によると、これについていくつかの異なった見解があるようです:D – bardiir

答えて

2

plugin.Initの中のthisは、plugin.Initを指し、pluginではありません。このようにそれを変更します。

プロトタイプ
var plugin = { 
    Init: function() { 
     plugin.UpdateUI(); 
     if (plugin.Status() == 1) { 
      ... 
     } else { 
      ... 
     } 
    }, 
    Status: function() { 
     ... 
    }, 
    UpdateUI: function() { 
     ... 
    } 
} 

function Plugin(){ 
    var self = this; 

    this.Init = function() { 
    self.UpdateUI(); 
    if (self.Status() == 1) { 
     ... 
    } else { 
     ... 
    } 
    }; 
} 

Plugin.prototype.status = function() { 
      ... 
    }; 
Plugin.prototype.UpdateUI: function() { 
    ... 
    } 

var plugin = new Plugin(); 
+1

なぜ 'this'は関数本体の中に侵入しませんか?これも可能ですか? – bardiir

+0

そうですね、それはそのような無効なコードです。あなたは 'self'を' plugin'に置き換える必要があります – jAndy

+0

なぜこれが彼のコードと何か違うのですか? –

2

initは、これは何か他のものであるかもしれないと呼ばれているコンテキストでは。

plugin.UpdateUIplugin.Statusを代わりに使用してください。常に正しい機能が参照されます。

関連する問題