我正在尝试在浏览器和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为真。
由于
答案 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
不同的对象。