2017-08-22 5 views
0

モジュールの私の理解は、それらがお互いに区別されることです。しかし、私はなぜこのコードが動作するのか理解していません。このモジュールは、他のモジュールのデータをどのように知っていますか?

node.jsフレームワークに3つのファイルがあるとします。一つの "app.js" ドライバファイルと二つのモジュール:

module.exports = { 

    name: null 

} 

モジュール "two.js" ロードモジュール「one.js:

モジュール単にプロパティが呼び出された "名前" "one.js"今

var one = require('./one'); 

module.exports = { 

    printname: function() 
    { 
     console.log(one.name); 
    } 

} 

ドライバ(app.js)両方のモジュールをインポートし、最初のプロパティを設定: 『モジュールone.js『の』名前」とプロパティの内容をプリントアウトする機能を宣言します』モジュールを呼び出し、2番目の名前印刷機能を呼び出します。

var one = require("./one"); 
var two = require("./two"); 

two.printname(); 

one.name = "John"; 

two.printname(); 

これを実行すると、「null」(罰金、それは空白)、「John」(罰金ではありません)が印刷されます。 2番目のモジュールは、最初のモジュールの値をどのようにして学習していますか?

"two.js"が独自のバージョンの "one.js"を読み込んだとき、プロパティ "name"は常にnullにする必要があります。なぜこれは当てはまりませんか?

答えて

1

Objectのプロパティを変更するため、オブジェクトが参照渡しされるため、one.jsをインポートしたすべてのインスタンスで同じインスタンスが取得されます。

異なるインスタンスが必要な場合は、classをエクスポートしてオンデマンドでインスタンスを作成する必要があります。そのような

何か:

//one.js 
class Data { 
    constructor(data) { 
     this.data = data; 
    } 
} 
export.module = Data; 

//two.js 
const Data = require('./one'); 
const data = new Data('John'); 
1

oneの輸出は静的オブジェクトです。それは毎回newではありません。

あなたはそうのようにそれを変更することができます。そして、

module.exports = function() { 
    return { name: null } 
} 

var one = require("./one"); 

var willAlwaysBeNew = one(); 
willAlwaysBeNew.name = "john" 

var willAlwaysBeNewToo = one(); 

console.log(willAlwaysBeNew.name) // john 
console.log(willAlwaysBeNewToo.name) // null 
関連する問題