Object.defineProperty()学习记录
1.configurable
当且仅当该属性的 configurable
键值为 true
时,该属性的描述符才能够被改变,同时该属性也能从对应的对象上被删除。
默认为 false
。
Object.defineProperty(car,'price',{
configurable: false, //设置为false,再次对描述符将不能进行设置
})
Object.defineProperty(car,'price',{
configurable: true //此时将会报错
})
2.
enumerable
当且仅当该属性的 enumerable
键值为 true
时,该属性才会出现在对象的枚举属性中。
默认为 false
。
let car = {}
Object.defineProperty(car,'price',{
configurable: false,
enumerable: true,
})
car.price =2
console.log(car);//此时打印有值为undefined,说明修改无效
3.
writable
当且仅当该属性的 writable
键值为 true
时,属性的值,也就是上面的 value
,才能被赋值运算符
改变。
默认为 false
。
let car = {}
Object.defineProperty(car,'price',{
configurable: false,
enumerable: true,
writable: true
})
car.price =2
console.log(car);//此时price的值变成了2
4.
get
属性的 getter 函数,如果没有 getter,则为 undefined
。当访问该属性时,会调用此函数。执行时不传入任何参数,但是会传入 this
对象(由于继承关系,这里的this
并不一定是定义该属性的对象)。该函数的返回值会被用作属性的值。
默认为 undefined
。
set
属性的 setter 函数,如果没有 setter,则为 undefined
。当属性值被修改时,会调用此函数。该方法接受一个参数(也就是被赋予的新值),会传入赋值时的 this
对象。
默认为 undefined
。
let car = {}
Object.defineProperty(car,'price',{
enumerable: true,
configurable: true,
get(){
console.log('price属性被读取了')
return val
},
set(newVal){
console.log('price属性被修改了')
val = newVal
}
})
car.price =2
console.log(car.price);