在 node.js 中,而不是:
dummy = require('dummy')
dummy.aMethod()
dummy.anotherMethod()
我想直接在我的上下文中使用这些方法:
dummy = require('dummy')
loadMethods(dummy)
aMethod()
anotherMethod()
如何实现函数 loadMethods ?
在 node.js 中,而不是:
dummy = require('dummy')
dummy.aMethod()
dummy.anotherMethod()
我想直接在我的上下文中使用这些方法:
dummy = require('dummy')
loadMethods(dummy)
aMethod()
anotherMethod()
如何实现函数 loadMethods ?
您可以做的一件事是使用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
. 这样,您将始终获得预期的行为(this
will be dummy
),并且您将清楚地表明您正在使用的方法实际上是在dummy
模块中实现并使用其状态。找到一个好的 IDE,打字应该不是问题。
利用 的延展性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
上下文的更多信息