Skip to content

属性描述符

获取属性描述符

javascript
var obj = {
    value: 1,
    label: '名称'
}
var desc = Object.getOwnPropertyDescriptor(obj, 'value')
// desc = { configurable: true, enumerable: true, value: 1, writable: true }

修改属性描述符

javascript
Object.defineProperty(obj, 'value', {
    value: 2,
    // 属性不可重写
    writable: false,
    // 属性不可遍历, 不可见 
    // for(const key in obj)、Object.keys(obj)、console.log(obj) 都看不到
    enumerable: false,
    // 属性描述符不能再修改 
    configurable: false,
    get: function() {},
    set: function(value) {}
})

冻结一个对象,既不能修改属性,也不能添加属性

javascript
Object.freeze(obj)

密封一个对象,不能添加加属性

javascript
Object.seal(obj)

密封一个对象后虽然不能直接添加属性,但可以利用prototype

javascript
Class Goods {
    constructor(data) {
        data = { ...data }
        Object.freeze(data)
        Object.defineProperty(this, 'data', {
            get: function () {
                return data
            },
            set: function () {
                throw new Error('set data error)
            }
            configurable: false,
        })
        Object.seal(this)
    }
}


Goods.prototype.value = 'value'

冻结原型

javascript
Object.freeze(Class.prototype)