2011-09-05 12 views
6

:[コンストラクタを呼び出すとき]オプション `new`オペレータ

newオペレータはオプションです。

これはクールです! jQueryの人々はどのようにこのようなトリックを引っ張ったのですか?

答えて

7

ジョン・レシグはかなりこれを説明:http://ejohn.org/apps/learn/#36と基本的に

http://ejohn.org/apps/learn/#38Event関数とオブジェクト(関数はオブジェクトである)です。 Eventの最初の行は、関数として、または(new演算子を使用して)E​​ventオブジェクトのインスタンスとして呼び出されているかどうかをチェックします。

あなたは、具体的にjQueryはそれをしない方法を探している場合は、jQuery sourceのライン3134から3138を見て:

このため
jQuery.Event = function(src, props) { 
    // Allow instantiation without the 'new' keyword 
    if (!this.preventDefault) { 
     return new jQuery.Event(src, props); 
    } 

説明をthe jQuery formsです。

基本的には、3178-3194行でpreventDefaultイベントがEventプロトタイプに追加されます。イベントがnewでインスタンス化されている場合、このpreventDefaultメソッドが与えられます。それ以外の場合は定義されません。

+1

'this.preventDefault'とは何ですか? – Randomblue

+0

私のポストでアップデートをチェックしてください。 –

3

任意のユーザ定義のJavaScript関数は、new演算子を使用して呼び出すことも、呼び出すこともできます。 newがなければ、それは通常の関数と同じように機能します(それはそのためです)。 newを使用すると、インタプリタはプロトタイプが適切に設定された新しいオブジェクトを作成し、そのオブジェクトを呼び出しのthisパラメータにします。この新しいオブジェクトは、new演算子の結果です。以外の場合は、関数本体returnが明示的に値です。戻り値はそれを管理します。

あなたは

function foo() { 
    return { bar: 42 }; 
} 

を書くのであれば、あなたはなしかnewのいずれかでそれを呼び出すことができます - ボディは常に明示的に値を返さないし、決してそのthisを使用するため、違いはありません。

関連する問題