断言属性不可配置
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
是本机对象(这对于主机对象来说可能不可靠,请参阅示例),则可以使用delete
运算符。
当delete
与对象属性一起使用时,它返回调用[[Delete]]内部方法的结果。
如果属性是可配置的,则[[Delete]]将返回true
。否则,它将在严格模式下抛出TypeError
,或在非严格模式下返回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'); }
当然,如果该属性是可配置的,它将被删除。因此,您可以使用它来断言,但不能检查它是否可配置。
相关文章:
- 断言属性不可配置
- 使用Javascript而不是html数据属性配置Parsley
- 为什么此可配置属性不可删除
- 缺少咕噜声所需的配置属性
- Sencha Touch Store配置属性仅在“__proto__”;
- 使用script元素上的html data-*属性来配置引用的脚本文件
- Magento 1.9.2-更新自定义属性'delivery_time'在可配置的产品过程中
- 如何更改 Javascript 对象属性的可写可枚举和可配置值
- TypeError: 属性 Array.prototype.splice.call(..) 是不可配置的,无法删除
- 递归 js v3 未捕获的类型错误:无法读取未定义的属性“配置”
- 通过函数填充 Grunt 任务配置的“文件”属性
- 在 JSON.parse() 之后保留属性属性(可写、可配置)
- PyQT4:“类型错误:尝试配置不可配置属性的可配置属性
- 类型错误:属性 1 不可配置,无法删除
- 使现有的不可写和不可配置属性可写和可配置
- 如何在ECMAScript 5: Object中配置属性.创建或定义对象属性
- 访问自定义ui-router配置属性中的$stateParams
- 如何在Extjs 6中给视图项配置属性
- 对象的可配置属性和可写属性的区别
- 我没有'无法理解对象的可写和可配置属性