在node.js中,而不是:
dummy = require('dummy')
dummy.aMethod()
dummy.anotherMethod()
我想在我的上下文中直接使用这些方法:
dummy = require('dummy')
loadMethods(dummy)
aMethod()
anotherMethod()
如何实现loadMethods函数?
答案 0 :(得分:2)
您可以做的一件事就是使用with
,如下所示:
with (dummy) {
aMethod();
anotherMethod();
}
虽然不建议这样做,因为它会使很多事情变得模棱两可而且没有像你期望的那样表现。
要完全按照您的要求进行操作,您可以将这些方法添加到global
对象中。你可以使用这样的东西:
for (var prop in dummy) {
if (dummy.hasOwnProperty(prop)) {
global[prop] = dummy[prop];
}
}
这种方法也有其局限性 - 例如,你不能在函数体中使用aMethod(),this
对象是错误的(当然,你可以使用{{1保持正确)。此外,bind
实际上不是全局的,而是模块范围的 - 因此每个模块都有自己的global
对象。
因此,权衡选项,您应该坚持使用global
中的方法。通过这种方式,您将始终获得预期的行为(dummy
将为this
)并且您将清楚地表明您正在使用的方法实际上是在dummy
模块中实现的并使用其状态。找一个好的IDE,输入应该不是问题。
答案 1 :(得分: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
上下文here