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

标签 javascript ecmascript-6 es6-proxy

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/

相关文章:

javascript - Nodejs中的动态函数调用

javascript - 使用 es6 使用 chrome 进行调试

javascript - 使用 ES6 Proxies 隐藏私有(private)属性

javascript - dispatchEvent(new Proxy(event, {}) 不起作用

javascript - 使用 Good 在 Hapi.js 中记录请求和响应负载

javascript - 使用单个字符串 'right' 或 'left' 作为第二个参数旋转二维数组矩阵

javascript - 使用在动态表单字段中选择的 jQuery

javascript - 从项目外部导入文件

javascript - 胖箭代表团

函数 apply trap 的 javascript 代理无法访问接收者代理