javascript - 一般将上下文应用于方法别名

标签 javascript ecmascript-6

我遇到了一个无法解决的问题。我不知道这是缺乏知识,还是事实上在Javascript中根本不可能,但我希望能够了解它。

我正在尝试执行对象中的函数别名列表。执行这些函数时,我想像直接从实例本身执行它们一样使用它们,这样我就可以在被调用的方法中使用其他方法和实例变量。为了让我的解释更清楚,这里有一个例子:

class Bar {
  constructor() {
    this.name = "Bar";
  }
    
  someMethod() {
    console.log(this.name) // should log Bar
  }
}

class Foo {
  constructor() {
    this.name = "Foo";
  }

  someOtherMethod() {
    console.log(this.name) // should log Foo
  }
}

const bar = new Bar();
const foo = new Foo();


const methodList = {
  foo: bar.someMethod,
  baz: foo.someOtherMethod,
}

for(let prop in methodList) {
  methodList[prop](); // logs 2x undefined
}

for(let prop in methodList) {
  methodList[prop].apply(foo); //logs 2x Foo
}

从上面的例子中可以看出,this.name是类实例中的一个变量。执行第二个循环时,将按预期应用上下文并正确记录。我希望看到自动应用上下文,因为函数别名对象是在不同的文件中执行的,不知道 foobar 并且只是接收列表。

有什么办法可以实现这一点吗?

最佳答案

您可以将 foobar 方法包装在它们自己的函数中。在这些方法中,您可以在对象上调用对象的方法 someMethod()/someOtherMethod(),如下所示:

const methodList = {
  foo: (...args) => bar.someMethod(...args),
  baz: (...args) => foo.someOtherMethod(...args),
}

目前,您的第一个循环不起作用,因为您的 this 并未引用对象的实际上下文,因为这不是用于调用该方法的内容。相反,它引用您的 methodList

参见下面的示例:

class Bar {
  constructor() {
    this.name = "Bar";
  }
    
  someMethod() {
    console.log(this.name) // should log Bar
  }
}

class Foo {
  constructor() {
    this.name = "Foo";
  }

  someOtherMethod() {
    console.log(this.name) // should log Foo
  }
}

const bar = new Bar();
const foo = new Foo();


const methodList = {
  foo: (...args) => bar.someMethod(...args),
  baz: (...args) => foo.someOtherMethod(...args),
}

for(let prop in methodList) {
  methodList[prop](); // correct logs
}

关于javascript - 一般将上下文应用于方法别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56646489/

相关文章:

javascript - 如何从 javascript 中的嵌套异步函数传播返回值

javascript - 类层次结构 : Is there a cleaner pattern for this?

javascript - 如何将我的状态对象放入二维数组中?

Javascript/jQuery 设置时间延迟,从 DOM 中弹出底部元素

javascript - Set.constructor`alert\x28document.domain\x2 9```含义

javascript - 如何将数组与 setState 一起使用?

javascript - 将 Mediator 模式与 webpack 和 ES6 模块导入导出结合使用

css - 如何在 Drawer - Material UI 中将 MenuItem 设置为事件状态?

javascript - 检测 Angular 上的属性变化

javascript - 查看复选框是否被点击,直到被点击