2

有没有办法检测对象属性删除?

4

4 回答 4

1

是的,有可能。就像您可以对属性使用 setter/getter 一样,您可以对对象属性使用“删除器”函数。

function myFunc() {}
myFunc.prototype = {
    constructor: myFunc,

    deleteProp: function( prop ) {
        delete this[ prop ];
    }
};

在该deleteProp方法中,您可以在之前和之后做任何事情。

于 2012-07-03T06:42:19.720 回答
1

您可以使用hasOwnProperty或propertyIsEnumerable检查对象本身是否存在属性,但这本身不会告诉您该属性是否曾经存在并随后被删除。您可以使用以下方法测试自己的属性和继承的属性是否具有值:

if (typeof obj.prop != 'undefined') 

但这并不能告诉您该属性是否存在,只告诉您它是否被赋予了undefined以外的值。请注意,如果属性已创建但未分配属性,它仍将返回undefined。对于大多数目的来说,这就足够了。

你想用这个做什么?在 ES5 中,您可以使用Object.createObject.defineProperty创建不可删除的属性,但某些浏览器缺乏支持,因此不适合一般 Web。

于 2012-07-03T06:42:26.147 回答
0

您不能覆盖删除运算符,因此除了定期检查属性是否仍然存在之外,我认为您不能这样做。

编辑:这是 2012 年的正确答案。现在使用代理显然很容易

于 2012-07-03T06:13:37.707 回答
0

ES6 代理呢?(MDN用于参考,stackoverflow为简单起见)

文档明确指出,您可以为“ deleteProperty”添加一个“陷阱” ......或者简单地说 -每当从特定对象中删除属性时“监听” ( MDN进行救援)

const myObject = { say: 'hello', to: 'proxy' }
const proxyHandler = {
  deleteProperty(target, prop) {
    if (prop in target) {
      delete target[prop]
      console.log(`property removed: ${prop}`)
    }
  }
}
const proxy = new Proxy(myObject, proxyHandler)
delete proxy.to
console.log(myObject)

另外,请检查我可以使用浏览器的可比性

干杯!

于 2019-09-18T20:29:16.303 回答