var Assertion = function() {
return { "dummy": "data" };
}
Object.defineProperty(Object.prototype, 'should', {
set: function(){},
get: function(){
return new Assertion(this);
}
});
// Insert magic here.
// This needs to be false
console.log(({}).should === undefined);
ES5中有哪些选项可以撤消defineProperty
调用?
请不要像Object.defineProperty = function() { }
这样愚蠢的建议。
以下Object.defineProperty(Object.prototype, 'should', {})
是否not work
和Object.defineProperty(Object.prototype, 'should', { value: undefined })
在V8中抛出Uncaught TypeError: Cannot redefine property: defineProperty
Object.defineProperty(Object.prototype, 'should', {
set: function() {},
get: function() { return undefined; }
});
抛出same errordelete Object.prototype.should
也是does not work
2条答案
按热度按时间ux6nzvsh1#
一般来说,你不能撤销
defineProperty
调用,因为没有撤销栈或其他东西,JS引擎不会跟踪以前的属性描述符。例如,
您可以做的是 * 删除 * 或 * 重新配置 * 属性,或者 * 覆盖 * 它的值。正如在另一个答案中提到的,如果要删除或重新配置,
configurable
标志必须为true
。一旦用configurable:false
定义了属性,就不能更改configurable
标志。要删除一个属性(这应该是您想要做的),请使用
delete
:要重新配置,请再次使用
defineProperty
并传递不同的描述符:如本示例所示,可以使用
defineProperty
在访问器(get
/set
)和数据(value
)属性之间切换。要覆盖,请使用简单赋值。在这种情况下,您需要
writable
标志为true
。显然,这不适用于访问器属性。它甚至会抛出异常:请注意,当您使用
defineProperty
时,writable
默认为false
,但当您使用简单语法o.attr = val;
定义(以前不存在的)属性时,true
默认为false
。mv1qrgav2#
如果你想撤销最后一个
defineProperty
或者所有的defineProperty
,你可以使用这个类:(gist here)