Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:检测对象属性删除_Javascript - Fatal编程技术网

JavaScript:检测对象属性删除

JavaScript:检测对象属性删除,javascript,Javascript,有什么方法可以检测对象属性的删除吗?您不能覆盖delete操作符,因此,除了定期检查属性是否仍然存在外,我认为您无法做到这一点 编辑:这是2012年的正确答案。现在显然很容易处理是的,这是可能的。正如可以对属性使用setter/getter一样,也可以对对象属性使用“deleter”函数 function myFunc() {} myFunc.prototype = { constructor: myFunc, deleteProp: function( prop ) {

有什么方法可以检测对象属性的删除吗?

您不能覆盖delete操作符,因此,除了定期检查属性是否仍然存在外,我认为您无法做到这一点


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

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

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

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

deleteProp
方法中,您可以在之前和之后执行任何操作。

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

if (typeof obj.prop != 'undefined') 
但这并不能告诉您该属性是否存在,只是当它被指定了一个非未定义的值时。请注意,如果已创建属性但未指定属性,则它仍将返回undefined。在大多数情况下,这就足够了

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

ES6代理如何?(为方便参考)

文档明确说明,您可以为“删除属性”添加一个陷阱“。。。或者简单地说-“侦听”,每当从特定对象删除属性时(为了拯救)

此外,请检查浏览器的可比性


干杯

在2000年,在遥远的将来,您将能够使用JavaScript代理对象:我很好奇为什么要替换默认的原型对象。为什么不添加新方法,例如
myFunc.prototype.deleteProp=function(){…}
?您不必重置构造函数属性。@RobG只是一个习惯:-),但是,对于一个属性,使用
myFunc.prototype.deleteProp
是不够的,这不是真正的“检测”删除,即检测对“delete obj.prop;”的调用——相反,它提供了一个可以被调用的包装器。这可能会有帮助,但并不完全是人们要求的。我很少对可能仍然有用的东西投反对票,但我同意Venryx。这远远不是“检测对象属性删除”所期望的解决方案。
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)