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/