2012-05-09 9 views
0

を使用してからJavaScript関数の防止、私はおそらく何かが好きだろう:私は2つのプロパティを持つjavascriptの「クラス」を作成したい場合は、誤ってグローバルウィンドウ

var p = new Person("John", "Doe"); 
console.log(p.firstName + " " + p.lastName); 

この時点ではすべてが素晴らしいです。しかし、もし誰かが誤って(または故意に)次の呼び出し:

Person("Mary", "Smith"); // without "new" 
突然の

すべて、firstNamelastNameされているグローバルウィンドウのコンテキストの一部、および潜在的にページ全体をダウンさせる可能性があります。

console.log(window.firstName); // logs "Mary" 

Person「クラス」を構築する際に、これを防ぐためにしようとする良い方法はありますか?明らかに、誰かがJavaScriptで何かを壊したければ、彼らはそれを行うことができますが、私はベストプラクティスを探しています。

私はクラスの先頭にこのような何かを投げることができますが、それは良い答えだ場合、私は知らない。

if (this === window) { 
    console.log("You are fail"); 
    return; 
} 
+2

関数が 'new'なしで呼び出された場合、期待されるオブジェクトではなく' undefined'が返されるため、最小限のテストで非常に迅速にエラーを発見できます。エラーを隠そうとするよりも早く失敗する方が良い。 – RobG

答えて

3

あなたはthisinstanceof Person

var Person = function (firstName, lastName) { 
    if (!(this instanceof Person)) 
     throw "Person constructor called without \"new\"." 
    this.firstName = firstName; 
    this.lastName = lastName; 
}; 
であるかどうかを確認することができます

または、適切にコンストラクタを呼び出す必要があります。

var Person = function (firstName, lastName) { 
    if (!(this instanceof Person)) 
     return new Person(firstName, lastName) 
    this.firstName = firstName; 
    this.lastName = lastName; 
}; 

別の可能性は、strictモードであなたの関数の実行を持つことです。これにより、このシナリオではthisundefinedになり、TypeErrorが発生しますが、サポートされている実装でのみ発生します。

var Person = function (firstName, lastName) { 
    "use strict"; 
    this.firstName = firstName; 
    this.lastName = lastName; 
}; 
+1

私はこれを 'this'と' window'を比較した最後のスニペットよりも好きです。 –

+0

私はあなたの2番目の例も好きです - それはより多くの寛容になります。必ずしも正しいことではありませんが、それは間違いなく良いアイデアです。 –

+0

私は ''厳しい ''をもう少し調べなければならないでしょう - それはかなり興味深いようです。 –

関連する問題