gpt4 book ai didi

javascript - 如何删除代理创建的对象的属性?

转载 作者:行者123 更新时间:2023-11-30 11:47:02 24 4
gpt4 key购买 nike

proxy = new Proxy({}, {
deleteProperty(target, propKey){
console.log(arguments);

return true;
}
});

proxy.xx = 3;

delete proxy.xx; // log and return true

proxy.xx // 3

和代码一样,删除操作没有效果。

我读了delete operator在 MDN 上:

The delete operator removes a given property from an object. On successful deletion, it will return true, else false will be returned. However, it is important to consider the following scenarios:

  • 如果您要删除的属性不存在,delete 不会有任何效果并返回 true

  • 如果对象的原型(prototype)链上存在同名属性,则删除后,对象将使用原型(prototype)链中的属性(换句话说,删除只对自己的属性有影响)。

  • 不能从全局范围或函数范围中删除使用 var 声明的任何属性。

    • 因此,delete 无法删除全局范围内的任何函数(无论这是来自函数定义还是函数表达式的一部分)。

    • 可以使用 delete 删除作为对象一部分的函数(全局范围除外)。

  • 任何用 let 或 const 声明的属性都不能从它们定义的范围中删除。

  • 无法删除不可配置的属性。这包括 Math、Array、Object 等内置对象的属性,以及使用 Object.defineProperty() 等方法创建为不可配置的属性。

我觉得我的代码不属于上面这些,怎么解释呢?谢谢。

最佳答案

如果你想删除一个属性,你必须调用Reflect.deleteProperty() .仅返回 true 不会删除它,它只会调用 Reflect.deleteProperty() 返回 true:

const proxy1 = new Proxy({}, {
deleteProperty(target, propKey) {
return true;
},
});

proxy1.xx = 3;
// true, because deleteProperty trap returns true.
console.log(Reflect.deleteProperty(proxy1, 'xx'));
// 3, because it wasn't actually deleted.
console.log(proxy1.xx); // 3

const proxy2 = new Proxy({}, {
deleteProperty(target, propKey) {
Reflect.deleteProperty(target, propKey);
return false;
},
});

proxy2.xx = 3;
// false, because deleteProperty trap returns false.
console.log(Reflect.deleteProperty(proxy2, 'xx'));
// undefined, because it was deleted.
console.log(proxy2.xx);

关于javascript - 如何删除代理创建的对象的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40655553/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com