Ray*_*nos 35 javascript google-chrome node.js defineproperty
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);
Run Code Online (Sandbox Code Playgroud)
我在ES5中有哪些选项来撤消defineProperty呼叫?
没有愚蠢的建议,Object.defineProperty = function() { }请.
下列 Object.defineProperty(Object.prototype, 'should', {})
和 Object.defineProperty(Object.prototype, 'should', { value: undefined })
Uncaught TypeError: Cannot redefine property: defineProperty在V8中投掷a
Object.defineProperty(Object.prototype, 'should', {
set: function() {},
get: function() { return undefined; }
});
Run Code Online (Sandbox Code Playgroud)
引发相同的错误
delete Object.prototype.should也行不通
use*_*621 40
通常,您无法撤消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
});
Run Code Online (Sandbox Code Playgroud)
您可以执行的操作是删除或重新配置属性,或覆盖其值.如其他答案中所述,如果要删除或重新配置,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
Run Code Online (Sandbox Code Playgroud)
要重新配置,请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
Run Code Online (Sandbox Code Playgroud)
如此示例所示,您可以使用defineProperty在accessor(get/ set)和data(value)属性之间切换.
要覆盖,请使用简单的赋值.在这种情况下,您需要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!
});
Run Code Online (Sandbox Code Playgroud)
请注意,writable默认情况下false使用时defineProperty,但true使用简单语法o.attr = val;定义(以前不存在)属性时.
| 归档时间: |
|
| 查看次数: |
11762 次 |
| 最近记录: |