通常,您无法撤消defineProperty调用,因为没有撤消堆栈或其他东西。JS 引擎不跟踪以前的属性描述符。
例如,
Object.defineProperty(Object.prototype, 'foo', {
configurable: true,
value: 1,
enumerable: false
});
Object.defineProperty(Object.prototype, 'foo', {
get: function () {
alert('You cannot revert me');
return 2;
},
enumerable: true
});
您可以做的是删除或重新配置属性,或覆盖其值。如另一个答案中所述,如果要删除或重新配置,configurable则需要该标志。true一旦用 定义了属性configurable:false,就不能更改configurable标志。
要删除属性(这应该是您想要做的),请使用delete:
Object.defineProperty(Object.prototype, 'foo', {
configurable: true, // defaults to false
writable: false,
value: 1
});
delete Object.prototype.foo;
console.log(Object.prototype.hasOwnProperty('foo')); // false
要重新配置,请defineProperty再次使用并传递不同的描述符:
Object.defineProperty(Object.prototype, 'foo', {
configurable: true,
get: ...
set: ...
});
Object.defineProperty(Object.prototype, 'foo', {
value: undefined
});
console.log({}.foo); // undefined
console.log(Object.prototype.hasOwnProperty('foo')); // true
如本示例所示,您可以使用在访问器 ( / ) 和数据 ( ) 属性defineProperty之间进行切换。getsetvalue
要覆盖,请使用简单分配。在这种情况下,您需要将writable标志设为true. 显然,这不适用于访问器属性。它甚至抛出异常:
Object.defineProperty(Object.prototype, 'foo', {
configurable: true,
value: 1,
writable: true // defaults to false
});
Object.prototype.foo = undefined;
console.log(Object.prototype.foo); // undefined
console.log(Object.prototype.hasOwnProperty('foo')); // true
Object.defineProperty(Object.prototype, 'foo', {
get: function () {
return 1;
},
writable: true // JS error!
});
请注意,当您使用 时writable默认为,但当您使用简单语法定义(以前不存在的)属性时。falsedefinePropertytrueo.attr = val;