Skip to content
On this page

概念

{
    configurable: false,
    enumberable: false,
    value: 'value',
    writable: false,
    get: function() {
        console.log('get')
    },
    set: function(val) {
        console.log('set')
    }
}
  • configurable:当且仅当该属性的 configurable 为 true 时, 该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。
  • enumerable:当且仅当该属性的 enumerable 为 true 时,该属 性才能够出现在对象的枚举属性中
  • value:该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等) 。
  • writable:当且仅当该属性的 writable 为 true 时,value 才能被赋值运算 符改变
  • get:一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。当访问该 属性时,该方法会被执行,方法执行时没有参数传入,但是会传入 this 对象(由于继承 关系,这里的 this 并不一定是定义该属性的对象)。
  • set:一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。当属性值 修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。

获取属性描述符

const obj = {
    a:1
}
Object.getOwnPropertyDescriptor(obj,'a')

获取属性描述符

const obj = {
    a:1
}

Object.defineProperty(obj,'a',{
    value:10,
    writable:false, // 不可重写
    enumerable:false, // 不可遍历
    configurable:false, // 属性描述符不可更改
})

巧用 get、set

可以使用 get、set 控制变量的读写,在 set 中抛出异常提示

class UIGodds {
    constructor(g) {
        this.num = 1
        this.price = 5
        this.data = g
    }
}
===========> 改成

class UIGodds {
    constructor(g) {
       Object.defineProperty(this,'data',{
            get:function(){
                return g;
            }
            set:function(){
                throw new error("data 属性只读,不能被重新赋值")
            }
       })

       // 在 set 中控制变量的赋值
       let internalNum = 1
        Object.defineProperty(this,'num',{
            get:function(){
                return internalNum;
            }
            set:function(val){
                if(val < 10){
                    throw new error("num 变量不能小于10")
                }
                let temp = parseInt(val)
                if(temp !== val){
                    throw new error("num 变量必须是整数")
                }
                internalNum = val
            }
       })

       // 在 get 中控制输出,或者计算输出
       Object.defineProperty(this,'total',{
            get:function(){
                return this.num * this.price;
            }
       })

       const agood = {
        a:1
       }
       const goods = new UIgoods(agood)
       console.log(goods.total) // 5
    }
}