【问题标题】:How does this module know about the data in another module?这个模块如何知道另一个模块中的数据?
【发布时间】:2017-08-22 13:38:11
【问题描述】:

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

假设我在 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。为什么不是这样?

【问题讨论】:

    标签: javascript node.js


    【解决方案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');
    

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-28
        • 1970-01-01
        • 2019-07-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多