Nodejs引用module.exports

时间:2013-03-24 18:53:29

标签: javascript node.js module require

我正在尝试在浏览器和nodejs服务器之间共享一些js代码。为此,我只使用这些做法:http://caolanmcmahon.com/posts/writing_for_node_and_the_browser/

问题是我想导出一个函数,而不是一个对象。在节点中,您可以执行以下操作:

var Constructor = function(){/*code*/};
module.exports = Constructor;

以便在使用require时可以执行以下操作:

var Constructor = require('module.js');
var oInstance = new Constructor();

问题是当我尝试引用模块中的module.exports对象并使用该引用用我的函数覆盖它时。在模块中它将是:

var Constructor = function(){/*code*/};
var reference = module.exports;
reference = Constructor;

为什么这不起作用?我不想使用简单的解决方案在清洁代码中插入if,但我想理解为什么它是非法的,即使引用=== module.exports为真。

由于

1 个答案:

答案 0 :(得分:2)

它不起作用,因为reference 指向module.exports,它指向对象module.exports指向:

module.exports
              \ 
                -> object
              / 
     reference

reference分配新值时,只需更改reference指向的内容,而不是module.exports指向的内容:

module.exports
              \ 
                -> object

reference -> function

以下是简化示例:

var a = 0;
var b = a;

现在,如果您设置b = 1,则a的值仍为0,因为您刚刚为b分配了新值。它对a的价值没有影响。

  

我想了解为什么它是非法的,即使引用=== module.exports为真

它不是非法,这是JavaScript(和大多数其他语言)的工作方式。 reference === module.exports是正确的,因为在赋值之前,它们都引用同一个对象。分配后,references引用与modules.export不同的对象。