object.defineProperty(obj,prop,dedcriptor)
obj:目标对象。
prop:需要定义或修改的属性名
decriptor:目标属性所拥有的特性
包含的参数有:
- value:被定义的属性的值,默认值为undefind
- writable:是否可以被重写,也就是value属性是否可以被赋值,当writable的值为true的时候,可以被重写,反之不可以。
- enumerable:该属性是否可以被枚举,值为true可以被枚举,反之则不可以。
- configurable:该属性是否可以被删除,或者是否可以被修改,值为true可以被删除或者被修改,反之则不可以。
存取器getter\setter
注意:getter/setter属性中 不可以使用value和writable这两个属性
getter:当访问该属性时,执行该方法,返回值会作为该属性的值返回。
setter:当该属性被修改时,执行该方法,接收的参数为该属性的新值。
let obj = {
name:'xiaoming'
}
let initvalue = 18
Object.defineProperty(obj,'age',{
get:function(){
console.log('获取该属性的值');
return initvalue;//返回值为该属性的值
},
set:function(value){
console.log('接收到该属性的新值value');
initvalue = value;//将新值赋值给该属性
}
})
console.log(obj.age)
obj.age = 20
console.log(obj.age)
注意 :不要再getter中再次获取值,也不要在setter中再次设置值,否则会栈溢出。
例如:下面的例子就会一直获取一直获取,就会造成栈溢出。
let obj = {
name:'xiaoming'
}
let initvalue = 18
Object.defineProperty(obj,'age',{
get:function(){
console.log('获取该属性的值');
return obj.age;//返回值为该属性的值
},
set:function(value){
console.log('接收到该属性的新值value');
initvalue = value;//将新值赋值给该属性
}
})
console.log(obj.age)