断言 属性 不可配置
Assert that a property is not configurable
给定一个对象 obj
,我如何断言其 属性 prop
不可配置?
首先,我认为我可以使用 getOwnPropertyDescriptor
:
if(Object.getOwnPropertyDescriptor(obj, prop).configurable)
throw Error('The property is configurable');
但这并非万无一失,因为它可能已被修改:
var getDescr = Object.getOwnPropertyDescriptor;
Object.getOwnPropertyDescriptor = function() {
var ret = getDescr.apply(this, arguments);
ret.configurable = false;
return ret;
};
有没有万无一失的方法?
假设 obj
是 native object (this may be unreliable for host objects, see ), you can use the delete
operator。
当 delete
与对象 属性 一起使用时,它 return 是调用 [[Delete]] 内部方法的结果。
如果 属性 是可配置的,[[Delete]] 将 return true
。否则,它将在严格模式下抛出 TypeError
,或者在非严格模式下抛出 return false
。
因此,要断言 prop
是不可配置的,
在非严格模式下:
function assertNonConfigurable(obj, prop) {
if(delete obj[prop])
throw Error('The property is configurable');
}
在严格模式下:
function assertNonConfigurable(obj, prop) {
'use strict';
try {
delete obj[prop];
} catch (err) {
return;
}
throw Error('The property is configurable');
}
当然,如果属性是可配置的,就删掉。因此,您可以使用它来断言,但不能检查它是否可配置。
给定一个对象 obj
,我如何断言其 属性 prop
不可配置?
首先,我认为我可以使用 getOwnPropertyDescriptor
:
if(Object.getOwnPropertyDescriptor(obj, prop).configurable)
throw Error('The property is configurable');
但这并非万无一失,因为它可能已被修改:
var getDescr = Object.getOwnPropertyDescriptor;
Object.getOwnPropertyDescriptor = function() {
var ret = getDescr.apply(this, arguments);
ret.configurable = false;
return ret;
};
有没有万无一失的方法?
假设 obj
是 native object (this may be unreliable for host objects, see delete
operator。
当 delete
与对象 属性 一起使用时,它 return 是调用 [[Delete]] 内部方法的结果。
如果 属性 是可配置的,[[Delete]] 将 return true
。否则,它将在严格模式下抛出 TypeError
,或者在非严格模式下抛出 return false
。
因此,要断言 prop
是不可配置的,
在非严格模式下:
function assertNonConfigurable(obj, prop) { if(delete obj[prop]) throw Error('The property is configurable'); }
在严格模式下:
function assertNonConfigurable(obj, prop) { 'use strict'; try { delete obj[prop]; } catch (err) { return; } throw Error('The property is configurable'); }
当然,如果属性是可配置的,就删掉。因此,您可以使用它来断言,但不能检查它是否可配置。