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
会更容易。
这可能是一个没有解决方案的奇怪用例,但我很乐意听到有关如何解决它的任何答案。
问题:
我有一个全局定义的代理:
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.
如果你的问题是行
global.globalState["greet"] = "hi"
可以通过某种方式修改来更改Proxies get方法中的this
,那么答案是否定的。箭头函数是词法绑定的(所以它的 this
不能在不同的调用之间改变),即使你使用常规函数代替,仍然无法通过分配 属性 来调用它,由于该函数由运行时调用,并且代理是透明的,因此根本无法影响它(您甚至不知道该行调用了 setter)。
要动态更改 this
,您可以使用类似的东西:
let context = null;
// inside the getter
(function thisInjection() {
}).call(context);
然而,这需要修改代理代码,在这种情况下,将 this
替换为 context
会更容易。