dwh*_*ieb 5 javascript es6-proxy
我有一个从构造函数返回Proxy的类。当我尝试将此类的实例存储在IndexedDB中或使用发送对象时window.postMessage(),收到一条错误消息,指出无法克隆该对象。看来结构化克隆算法无法处理代理对象。
以下代码演示了该错误:
class MyClass {
constructor() {
return new Proxy(this, {
set(target, prop, val, receiver) {
console.log(`"${prop}" was set to "${val}"`);
return Reflect.set(target, prop, val, receiver);
}
});
}
}
const obj = new MyClass;
try {
window.postMessage(obj,'*');
} catch(err) {
console.error(err);
}Run Code Online (Sandbox Code Playgroud)
谁能建议解决此问题的方法?我看到了两个潜在的解决方案,但是我不知道如何实现它们:
不要从构造函数返回Proxy,而是以某种方式在类声明中维护Proxy功能。
更改代理实例,使其与结构化克隆算法一起使用。
编辑:以下更简单的代码也演示了结构化克隆错误:
const p = new Proxy({}, {});
window.postMessage(p, '*');Run Code Online (Sandbox Code Playgroud)
您可以将原始的非代理对象保存在类属性中,并在需要将其传递给postMessage. 您可以更改构造函数以具有一个可选参数,该参数将传递给代理而不是this. 这样,您可以通过将对象传递给构造函数来重新创建该对象。
class MyClass {
constructor(original = this) {
this.original = original;
return new Proxy(original, {
set(target, prop, val, receiver) {
console.log(`"${prop}" was set to "${val}"`);
return Reflect.set(target, prop, val, receiver);
}
});
}
export() {
return this.original;
}
static import(original) {
return new MyClass(original);
}
}
const obj = new MyClass;
obj.test = 1;
console.log(MyClass.import(obj.export()).test);
MyClass.import(obj.export()).test = 2;
try {
window.postMessage(obj.export(), '*');
} catch(err) {
console.error(err);
}Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
440 次 |
| 最近记录: |