javascript - 使用 `module` 作为命名空间

标签 javascript node.js

我一直在我的 node.js 模块中使用一种模式,这种模式对我来说非常明显,以至于我认为它一定有问题,否则我会看到更多人这样做。为了保留模块全局的私有(private)变量,我只是将它们作为属性附加到模块对象上。像这样:

module.exports = {

  init: function() {
    module.someClient = initializeSomethingHere()
  },

  someMethod: function(done) {
    module.someClient.doSomething(done)
  }
}

这对我来说似乎比这样的东西更可取......

var someClient;

module.exports = {
  init: function() {
    someClient = initializeSomethingHere()
  },

  someMethod: function(done) {
    someClient.doSomething(done)
  }
}

...因为在第二个示例中,您需要在文件顶部搜索 var someClient 以确保省略 var 关键字在 init 方法中是有意的。不过,我从未见过这种模式在其他地方使用过,所以我想知道我是否遗漏了一些让它不太理想的东西。

想法?

最佳答案

我想到了几个可能的缺点。

1) 在模块外部访问和修改这些属性在技术上是可能的,但前提是在模块外部可以使用对模块本身的引用。通过自己的导出使模块可用的东西(module.exports = module; 是最简单的例子)会暴露它们。

2) 您可能与内置属性或 future 尚不存在的内置属性发生命名冲突(这会导致您的代码在 node.js 的 future 版本中中断)。这可能是非常有问题的并且很难调试。目前,模块对象的内置属性是:children、exports、filename、id、loaded、paths,parent

because in the second example you need to go searching for var someClient at the top of the file to make sure that the omission of the var keyword is intentional within the init method.

如果是这个原因,您可以只使用不是 module 的命名空间。例如,将 var private = {}; 添加到每个文件的顶部,然后使用 private.someClient 而不是 module.someClient

还有 'use strict'; 以便意外遗漏 var 是一个错误,而不是一个意外的全局。

关于javascript - 使用 `module` 作为命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36440450/

相关文章:

javascript - 如何创建在移动设备和桌面设备之间动态变化的粘性 header (无汉堡包)

javascript - 如何将被拒绝的 promise 转换为异常并将其从 Express 路由处理程序中抛出?

node.js - Node 客户端 session 与快速 session

node.js - 如何在nodejs中进行API调用

javascript - 如何在不延迟的情况下正确获取 setInterval 内的某些元素宽度?

javascript - 防止访问者使用 Firebug 或其他控制台进行欺诈

javascript - 未捕获类型错误 : cannot read property 'null' value for document. getElementByID().value;

node.js - 将nodejs和npm添加到Jenkins docker镜像

javascript - JSDom 不将文本作为脚本运行

Javascript:薪资计算器(无法显示正确的数字)