1

我正在尝试在浏览器和 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 ,但我想了解为什么它是非法的,即使 reference===module.exports 是真的。

谢谢

4

1 回答 1

2

它不起作用,因为reference指向,它指向的对象指向:module.exportsmodule.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

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

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

于 2013-03-24T18:58:56.247 回答