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

Add dynamically methods of an object in my context

本文关键字:动态 方法 对象 添加 我的 上下文      更新时间:2023-09-26

In node.js,而不是:

dummy = require('dummy')
dummy.aMethod()
dummy.anotherMethod()

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

dummy = require('dummy')
loadMethods(dummy)
aMethod()
anotherMethod()

如何实现函数加载方法?

你可以

做的一件事是使用 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将被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上下文的更多信息