0

在 node.js 中,而不是:

dummy = require('dummy')

dummy.aMethod()
dummy.anotherMethod()

我想直接在我的上下文中使用这些方法:

dummy = require('dummy')
loadMethods(dummy)

aMethod()
anotherMethod()

如何实现函数 loadMethods ?

4

2 回答 2

2

您可以做的一件事是使用with,如下所示:

with (dummy) {
  aMethod();
  anotherMethod();
}

但不建议这样做,因为它会使很多事情变得模棱两可,并且不会像您期望的那样表现。

要完全按照您的要求进行操作,您可以将这些方法添加到global对象中。你可以使用这样的东西:

for (var prop in dummy) {
  if (dummy.hasOwnProperty(prop)) {
    global[prop] = dummy[prop];
  }
}

但是,这种方法也有其局限性——例如,您不能在函数体中使用 aMethod(),this对象将是错误的(当然,您可以使用bind它来保持正确)。此外,global它并不是真正的全局,而是模块范围的——所以每个模块都有自己的global对象。

因此,权衡选项后,您可能应该坚持使用dummy. 这样,您将始终获得预期的行为(thiswill be dummy),并且您将清楚地表明您正在使用的方法实际上是在dummy模块中实现并使用其状态。找到一个好的 IDE,打字应该不是问题。

于 2012-08-10T22:22:36.963 回答
1

利用 的延展性this。当一个函数在没有被绑定到特定范围的情况下被调用时this(可以通过.call.apply或在方法上下文中完成),则this指的是全局对象。此代码将在浏览器和 Node.js 中运行,但当然会覆盖任何其他具有相同名称的全局范围的函数。谨慎使用……总的来说,我建议不要使用它。

function loadMethods(obj) {
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop) && typeof(obj[prop]) === 'function') {
            this[prop] = obj[prop]
        }
    }
}

您可以在此处了解有关this上下文的更多信息

于 2012-08-10T22:51:40.270 回答