【问题标题】:JavaScript: Detect Object Property DeletionJavaScript:检测对象属性删除
【发布时间】:2012-07-03 06:09:24
【问题描述】:

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

【问题讨论】:

标签: javascript


【解决方案1】:

是的,这是可能的。正如您可以对属性使用 setter/getter 一样,您可以对对象属性使用“删除”函数。

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

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

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

【讨论】:

  • 我很好奇你为什么要替换默认的原型对象。为什么不直接添加新方法,例如myFunc.prototype.deleteProp = function(){...}?您不必重置构造函数属性。
  • @RobG 只是一种习惯 :-) 但是,对于一个属性,使用 myFunc.prototype.deleteProp 就足够了
  • 这并不是真正的“检测”删除,即。检测对“删除 obj.prop;”的调用-- 相反,它提供了一个可以被调用的包装器。这可能会有所帮助,但并不完全符合要求。
  • 我很少对可能仍然有用的东西投反对票,但我同意 Venryx 的观点。这远不是人们期望的“检测[ing]对象属性删除”的解决方案。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    文档明确指出您可以为“deleteProperty”...添加一个“trap”,或者简单地说 - “listen” 每当从特定对象中删除属性时(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)
    

    另外,请检查Can I Use 以了解浏览器的可比性

    干杯!

    【讨论】:

      【解决方案4】:

      你不能覆盖删除操作符,所以除了定期检查一个属性是否仍然存在之外,我认为你不能这样做。

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

      【讨论】:

        猜你喜欢
        • 2020-07-08
        • 2010-09-17
        • 1970-01-01
        • 2011-01-16
        • 2019-08-27
        • 2016-01-19
        相关资源
        最近更新 更多