2012-02-01 191 views
10

为了充分利用Node的模块/ require()/ exports而努力做一些适当的OO编程。创建全局名称空间并且不使用导出(如在客户端js应用程序开发中)是否是一种好的做法?因此,在模块(Namespace.Constructor.js):Node.js命名空间

Namespace = Namespace || {}; 
Namespace.Constructor = function() { 
    //initialise 
} 
Namespace.Constructor.prototype.publicMethod = function() { 
    // blah blah 
} 

...在调用文件只是用...

requires('Namespace.Constructor'); 
var object = new Namespace.Constructor(); 
object.publicMethod(); 

感谢

+3

使用'exports'或'module.exports'。您的模块已经命名空间。只需按照[这些文档](http://nodejs.org/docs/latest/api/modules.html)。 – nicerobot 2012-02-01 19:57:23

回答

16

在node.js的,模块位置是命名空间,因此您不需要在代码中使用名称空间。我认为这有一些问题,但它们是可以管理的。 Node只会公开您附加到module.exports对象的代码和数据。

在您的例子,使用以下命令:

var Constructor = function() { 
    // initialize 
} 
Constructor.prototype.publicMethod = function() {} 
module.exports = Constructor; 

,然后在你的调用代码:

var Constructor = require('./path/to/constructor.js'); 
var object = new Constructor(); 
object.publicMethod(); 
+1

但是,如果我们不使用var,则创建一个全局并可供调用者使用。那么为什么我们需要使用出口? – hacklikecrack 2012-02-02 09:19:31

+1

避免名称在全局空间中发生冲突。当然,你可以创建你自己的命名空间系统,但require()可以很好地工作,并且是node.js开发中的明确标准。 – 2012-02-03 00:18:36

+7

hacklikecrack:缺少模块中的var不会创建可从调用方获得的全局。节点会自动将您的模块代码封装在一个函数中以防止这种情况发生 – 2012-12-11 16:34:17