关于Object.defineProperty的讲解 =》https://blog.csdn.net/qq_39258552/article/details/84235050
1.Object.defineProperty()
var obj = {};
Object.defineProperty(obj,'name',{
configurable: false,
writable: false,
enumerable: false,
value: 'xxxx'});
obj.name = 111; //尝试修改name的值为111
obj.name; //=》name的值依然是"xxxx",因为writable设置的值是false
delete obj.name//=》尝试删除obj.name 会失败,因为configurable设置的值是false
for(let key in obj){
console.log(key) //没有遍历出‘name’因为enumerable设置的值是false
}
Object.keys(obj); //=》遍历obj上所有的属性得到空数组 [ ]
2.Object.defineProperties()
var objs = {};
Object.defineProperties(objs,{
title: { value: '学生' },
crop: { value: 'null' },
salsry: { value: 4000 }
});
var des1 = Object.getOwnPropertyDescriptor(objs,'title');
des1 //=》{value: "学生", writable: false, enumerable: false, configurable: false}
通过Object.defineProperty、Object.defineProperties添加的属性,在不设置的情况下其configurable、enumerable、writable默认都是false
通过字面量.的形式添加的属性,其configurable、enumerable、writable默认都为true
2.1
var objs = {}
Object.defineProperties(objs,{
title: { value: '学生', enumerable: true},
crop: { value: 'null', enumerable: true},
salsry: { value: 4000, enumerable: true, writable: true},
luck: {
get: function() {
return Math.random() > 0.5 ? 'good' : 'bad';
}
},
promote: {
set: function(lev) {
this.salsry *= 1 + lev * 0.1;
}
}
});
objs.luck; //=》"bad" 通过get方法获取,当设置get/set不允许使用writable和value这两个属性
objs.salsry; //=》4000
objs.promote = 3; //=》通过set方法传入3
objs.salsry //=》5200