首页 > 解决方案 > JavaScript 将代理 getter/setter 绑定到特定上下文

问题描述

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

问题:

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

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
  }
})

在其他地方我有一堂课:

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

this是否可以从类构造函数绑定到this代理的 getter 和 setter 中?所以基本上,类构造函数的上下文需要从代理 getter 和 setter 内部访问。

标签: javascriptproxy

解决方案


如果你的问题是线

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

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


要动态更改this,您可以使用以下内容:

 let context = null;

 // inside the getter
 (function thisInjection() {

 }).call(context);

但是,这将需要修改代理代码,在这种情况下替换thiscontext会更容易。


推荐阅读