[英]Why proxy and Object.create don't work together
當我像下面那樣這樣做時,我總是得到“RangeError:超出最大調用堆棧大小”,但我只是訪問接收器,如果我刪除console.log(receiver);
, 很困惑。
const someObject = {};
const proxy6 = new Proxy(someObject, {
get(target, prop, receiver) {
console.log(receiver);
return 111;
},
});
const derived = Object.create(proxy6);
console.log(derived.someProperty);
我嘗試使用 Object.assign() 來包裝代理,沒關系。
該行為依賴於實現。 例如,Firefox(我運行的是 108 版)這段代碼沒有問題,只是在控制台中打印 object 表示:
在 Chrome/Edge 中,控制台實現想要檢索它要打印的 object 的一些 object 屬性,包括[Symbol.toStringTag]
。 但是由於receiver
是derived
的,這會再次啟動代理的get
處理程序,從而導致無限遞歸。
為避免這種情況,請使您的處理程序代碼有條件:准確確定您希望何時執行該console.log
並返回 111。
所以做這樣的事情:
const someObject = {}; const proxy6 = new Proxy(someObject, { get(target, prop, receiver) { if (["someProperty"].includes(prop)) { // Add more props as desired... console.log(receiver); return 111; } return Reflect.get(target, name); // default }, }); var derived = Object.create(proxy6); console.log(derived.someProperty);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.