访问器属性
访问器属性是为了解决:开关的保护是死板的,不灵活的,法用自定义规则保护属性,注意:每个数据属性的缩微对象中都包含四个属性:
value: 属性值
实际存储属性值writable: true/false
控制是否可修改当前属性的值enumerable: true/false
控制是否可被for in遍历到该属性的值——半隐藏configurable: true/false
控制是否可删除该属性 ,控制是否可修改前两个开关
访问器属性的代码如下:
//创建一个对象
var lilei = {
uname: "zhang",
uage: "25",
salary: 25000,
}
//调用函数
Object.defineProperties(lilei, {
_uage: {
value: lilei.uage,
writable: true,
enumerable: false,//这边默认的就是半隐藏的,遍历不到,如果想遍历到,必须将开关改为true
configureable: false,
},
uage: {
get: function () {
return this._uage;
},
set: function (value) {
if (value > 18 && value < 65) {
this._uage = value;
} else {
console.log(`不能修改`);
throw Error("年纪超出范围")
}
},
enumerable: false,
configurable: false,
},
})
lilei.uage = 30;
console.log(lilei.uage)
console.log(lilei)
for (var key in lilei) {
console.log(lilei[key])
}
- 这里面的
get
和set
函数(名字不可更改,此处为定义好的函数),是对象直接调用的,且都是半隐藏属性,需要注意的是,这里添加的_uage
属性,也是半隐藏的,是遍历不到的,但是可以通过点属性,访问到; - 当试图获取
uage
的值时,自动调用get()
,由于是对象直接调用,所以,this
指向对象本身;
当试图修改uage
的值时,自动调用set()
,将实参传入,进行判断,不符合则报错。