断言 属性 不可配置

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;
};

有没有万无一失的方法?

假设 objnative 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');
    }
    

当然,如果属性是可配置的,就删掉。因此,您可以使用它来断言,但不能检查它是否可配置。