JavaScript 将代理 getters/setters 绑定到特定上下文

JavaScript binding Proxy getters/setters to a specific context

这可能是一个没有解决方案的奇怪用例,但我很乐意听到有关如何解决它的任何答案。

问题:

我有一个全局定义的代理:

this.appState = {}
global.globalState = new Proxy(this.appState, {
  get: (target, prop, receiver) => {
    console.log(this) // #3
    return Reflect.get(...arguments)
  },
  set: (obj, prop, value) => {
    console.log(this) // #2
    obj[prop] = value
    return true
  }
})

在其他地方我有 class:

export default class MyClass {
  constructor() {
    console.log(this) // #1
    global.globalState["greet"] = "hi"
    console.log(this.globalState["greet"])
  }
}

是否可以将 class 构造函数中的 this 绑定到代理的 getter 和 setter 中的 this?所以基本上,需要从代理 getter 和 setter.

内部访问 class 构造函数的上下文

如果你的问题是行

global.globalState["greet"] = "hi"

可以通过某种方式修改来更改Proxies get方法中的this,那么答案是否定的。箭头函数是词法绑定的(所以它的 this 不能在不同的调用之间改变),即使你使用常规函数代替,仍然无法通过分配 属性 来调用它,由于该函数由运行时调用,并且代理是透明的,因此根本无法影响它(您甚至不知道该行调用了 setter)。


要动态更改 this,您可以使用类似的东西:

 let context = null;

 // inside the getter
 (function thisInjection() {

 }).call(context);

然而,这需要修改代理代码,在这种情况下,将 this 替换为 context 会更容易。