在我的上下文中动态添加对象的方法

时间:2012-08-10 21:51:24

标签: javascript node.js

在node.js中,而不是:

dummy = require('dummy')

dummy.aMethod()
dummy.anotherMethod()

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

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

aMethod()
anotherMethod()

如何实现loadMethods函数?

2 个答案:

答案 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