javascript - 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 内部访问。
解决方案
如果你的问题是线
global.globalState["greet"] = "hi"
可以通过某种方式修改以更改this
Proxies get 方法中的,那么答案是否定的。箭头函数是词法绑定的(因此它this
不能在不同的调用之间更改),即使您使用常规函数,仍然无法通过分配属性来调用它,因为该函数是由运行时调用的,并且由于代理是透明的,因此根本无法影响它(您甚至不知道该行调用了 setter)。
要动态更改this
,您可以使用以下内容:
let context = null;
// inside the getter
(function thisInjection() {
}).call(context);
但是,这将需要修改代理代码,在这种情况下替换this
为context
会更容易。
推荐阅读
- c++ - 为什么 MSVC 会优化掉这个 memcpy 调用?
- java - 如何创建 LIFO 队列通道
- python - 如何使用 many2one 字段从 odoo 10 中的其他链接模型中搜索记录?
- jsonschema - AnyOf 与类型数组
- java - 使用 Junit 测试多线程 Java 应用程序时模拟用户控制台输入时的有趣行为
- javascript - 以可扩展的形式将值从一个表单字段传递给其他表单字段
- mercurial - Mercurial 的自定义变量可能吗?
- bash - 如何将另一个文件中的文件 pwd 重定向到 diff -q 命令?
- javascript - 如何修复 nodejs express 服务器中的“MulterError:Unexpected field”?
- python - Python Pycryptodome 加密引发“长度不正确的密文”错误