【问题标题】:Node.js namespacingNode.js 命名空间
【发布时间】:2012-02-01 18:15:41
【问题描述】:

为了充分利用 Node 的 module/require()/exports 设置来进行正确的 OO 编程,有点努力。创建全局命名空间而不使用导出(如在客户端 js 应用程序开发中)是一种好习惯吗?所以,在模块(Namespace.Constructor.js)中:

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

...在调用文件时只需使用...

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

谢谢

【问题讨论】:

  • 使用exportsmodule.exports。您的模块已经命名空间。只需关注these docs

标签: node.js


【解决方案1】:

在 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();

【讨论】:

  • 但如果我们不使用 var,则会创建一个全局变量并可供调用者使用。那么为什么我们需要使用导出呢?
  • 为了避免全局空间中的名称冲突。当然,您可以创建自己的命名空间系统,但 require() 工作得相当好,并且是 node.js 开发中的明确标准。
  • hacklikecrack:模块中缺少 var 不会创建调用者可用的全局变量。 Node 会自动将你的模块代码包装在一个函数中以防止这种情况发生。
猜你喜欢
  • 2013-08-21
  • 2012-07-21
  • 2021-11-18
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
  • 2010-12-23
  • 1970-01-01
相关资源
最近更新 更多