2013-03-24 80 views
1

我试图做一些浏览器和nodejs服务器之间共享的js代码。要做到这一点,我只是使用这些做法:http://caolanmcmahon.com/posts/writing_for_node_and_the_browser/Nodejs引用module.exports

问题是当我想导出一个函数,而不是一个对象。在节点,你可以这样做:

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

,以便需要时使用,你可以这样做:

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

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

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

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

感谢

回答

2

它不工作,因为referencemodule.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不同的对象。