Object.defineProperty()

95 阅读1分钟

当我们对一个object对象设置属性时,一般通过obj.a=1obj["a"]=1这种方式添加和更改属性值,默认该属性是可枚举的,但是如果我们想再新增属性后不允许更改属性值或者将该属性值设置为非枚举值,如何处理?

静态方法Object.defineProperty(target,propKey,descriptor)

target  对象
propKey  要添加或修改的属性名
descriptor 描述符对象 

其中descriptor描述符对象

value:当前值
enumerable:是否可枚举 默认值flase
writable:是否可被修改 默认值flase
configurable:是否可被删除 默认值flase
get:读取时内部调用的函数
set:写入时内部调用的函数

注意点,当使用get和set时,不允许使用value和writable,否则报错

let  person = {
        name:"赵",
        age: 18
}
Object.defineProperty(person,'sex',{
          value:"男",
          enumerable:true, // 是否可枚举,默认值false
          writable:true,  // 是否可被修改 默认值flase
          configurable:true, // 是否可被删除 默认值flase
})
for(let key in person){ console.log(key) } // name age sex
person.sex = '女' 
delete person.sex
console.log(person)

get和set

  let val = 'value值'
  let target = { }
  Object.defineProperty(target,'sex',{
          get:function(){
                  return val
          },
          set:function(newValue){
                  return newValue
          }
  })
  target.sex = 1
  console.log(target.sex) // value值
function Person() {}
Object.defineProperty(Person.prototype, 'name', {
   get: function() {
       return this._name;
   },
   set: function(newValue) {
       this._name = newValue;
   }
});
const a = new Person();
const b = new Person();
a.name = '赵';
b.name = '钱';
console.log(a.name,b.name); // 赵 钱