2012-07-03 78 views

回答

0

你不能覆盖删除操作,所以除了定期检查一个属性是否还在这里,我认为你不能这样做。

2

是的,这是可能的。就像您可以使用setter/getters来获取属性一样,您可以使用对象属性的“deleter”函数。

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

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

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

+0

我很好奇你为什么要替换默认的原型对象。为什么不只是添加新的方法,例如'myFunc.prototype.deleteProp = function(){...}'?您不必重置构造函数属性。 – RobG

+0

@RobG只是一种习惯:-)但是,对于只有一个属性,使用'myFunc.prototype.deleteProp'就足够了 –

+0

这并不是真的“检测”删除,即。检测对“删除obj.prop;”的调用 - 相反,它提供了一个可以调用的包装器。这可能会有所帮助,但并不完全符合要求。 – Venryx

1

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

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

但物业是否存在不告诉你,只有whehter已分配以外的值比不确定。请注意,如果该属性已创建但未分配属性,它仍将返回未定义。对于大多数目的而言,这就足够了。

你想用这个做什么?在ES5中,您可以使用Object.createObject.defineProperty创建不可删除的属性,但某些浏览器缺少支持,因此不适用于常规网络。