该模块如何了解另一个模块中的数据?

时间:2017-08-22 05:28:46

标签: javascript node.js

我对模块的理解是它们彼此不同。但是我不明白为什么这段代码会起作用。

假设我在node.js框架中有三个文件。一个“app.js”驱动程序文件和两个模块:

模块“one.js”只有一个名为“name”的属性:

module.exports = {

    name: null

}

模块“two.js”加载模块“one.js”并声明一个函数,该函数在“one.js”模块中打印出属性“name”的内容:

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

module.exports = {

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

}

现在驱动程序(app.js)导入两个模块,设置第一个模块的属性,然后调用第二个模块的名称打印功能:

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

two.printname();

one.name = "John";

two.printname();

当我运行它时,它会打印“null”(很好,它应该是空的),然后是“John”(不是很好)。第二个模块如何在第一个模块中学习价值?

我的思维过程是:当“two.js”加载自己版本的“one.js”时,属性“name”应该始终为null。为什么不是这样?

2 个答案:

答案 0 :(得分: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 :(得分: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