2012-04-27 13 views
2

クラスの関数メンバーでthisオブジェクトを使用します。この関数は、クラスのインスタンスによって異なる場合があります。それは正常に動作しますが、Google Closure Compilerは私に警告を送信し、私はそれを正しくやっていないと思います。Javascript - クラスの関数メンバーで 'this'の正しい使い方

私の質問:プロトタイプでもコンストラクタでもない関数でthisを使用する正しい方法は何ですか? いいえの場合は、thisを使用する代わりに、どうすればよいですか?ここで

は私がしようとしているかの実例である:私はこの警告を取得しています

/** @constructor */ 
function MyAlert() {} 
/** @type {string} */ 
MyAlert.prototype.name = "joe"; 
/** @type {function()} */ 
MyAlert.prototype.myAlert; 

/** @type {MyAlert} */ 
var formalAlert = new MyAlert(); 

/** @type {MyAlert} */ 
var informalAlert = new MyAlert(); 

informalAlert.myAlert = function() {alert("Hi " + this.name);} 
formalAlert.myAlert = function() {alert("Good morning Mr " + this.name);} 

formalAlert.myAlert(); 
informalAlert.myAlert(); 

compilingますが、それを回避する方法を見つけることができませんでした:

JSC_USED_GLOBAL_THIS: dangerous use of the global this object at line 11 character 57 
formalAlert.myAlert = function() {alert("Good morning" + this.name);} 
                 ^

感謝あなたの助けにたくさん!あなたの例から

+0

は、なぜあなたはプロトタイプにこれらのメソッドを取り付けることがwouldntは:

は、この警告を黙らするためには、単に「この」オブジェクトの種類コンパイラに指示する必要がありますか? – Tejs

+0

私はそれについて心配しません。あなたがやっていることは、プロトタイプから継承された振る舞いをオーバーライドするための完全に有効な方法です。 – Prestaul

+3

[Closure Compiler Warning 'グローバルなこのオブジェクトの危険な使用 'の可能な複製?](http://stackoverflow.com/questions/5301373/closure-compiler-warning-dangerous-use-of-the-global-this-オブジェクト) –

答えて

2

formalAlert.myAlert = function() {...} 

は(ない置き換え)影formalAlert上の新しい静的プロパティプロトタイプを作成します。まだ完全に有効なJavaScriptですが、コンパイラがこれらを異なるプロパティとして正しく認識していることを認識することが重要です。

formalAlert.myAlert = /** @this {MyAlert} */ function() {...}; 
+0

JSDocコメントは前に行に行くこともできます。 – John

関連する問題