2013-07-11 24 views
7

はのは、このコードでfile.jsてみましょう:node.jsのnew演算子ではどのように動作する必要がありますか?

module.exports.func = function(txt) { 
    this.a = 1; 
    this.b = 2; 
    console.log(txt, this); 
    return this; 
} 

今、私たちは次の操作を実行し、別のJSファイルを持っている:

意図したとおりにそれが動作R1の場合
var r1 = new (require('./file')).func('r1'); 
var r2 = new require('./file').func('r2'); 

を - r1はへの参照が含まれています新しく作成されたオブジェクト。

r2の場合は動作しません - r2はfile.jsからmodule.exportsへの参照を取得します。

目的は、func()コンストラクタを呼び出して新しいオブジェクトを作成することでした。 R2はR1と同じように動作しない理由

var r3 = require('./file'); 
var r4 = new r3.func('r1'); 

は、しかし、私は理解していない:確かに、私はまた、R1と同じである。この方法でそれを行うことができます。

require( './ file')の前後の余分な括弧はどのように違いますか?

答えて

16

これらの2つのバージョンは根本的に異なります。この1

new (require('./file')).func('r1'); 

./fileの輸出を返すと、結果にnew演算子を呼び出し、必要に実行します。

この1:

var r2 = new require('./file').func('r2'); 

呼び出しますが、コンストラクタとして必要です。


のは、より多くの孤立し、簡単な例を見てみましょう。偉大な説明のための

new Date() // creates a new date object 
new (Date()) // throws a TypeError: string is not a function 
+1

感謝を。コンパイラがnewの右側にある関数を見つけたら、それをコンストラクタとして呼び出すと、新しい演算子を正しく理解できますか?しかし、オブジェクトがある場合(r1の場合、after(require( './ file'))の評価)、それは継続してファイル( 'r1')が関数であるかどうかをチェックし、それをコンストラクタとして呼び出します。私は正しいですか? –

+0

はい、あなたは正しいです。 –

+0

確認していただきありがとうございます。どのように新しいオペレータが解釈されているかについてのこのような情報はどこにも見つかりませんでした。( –

関連する問題