为对象添加属性的方法:Object.defineProperty(obj,prop,descriptor)
属性描述符分为:数据属性描述符和存取属性描述符(vue2响应式原理)
常规声明obj以下属性均为true,用defineProperty的话均为false
Configurable影响属性的重新配置(限于defineProperty)和删除
Enumberable影响该对象属性的遍历,为false时遍历时该属性不显示
writable影响属性的写入,为false在非严格模式可通过obj修改不报错,但是实际上obj还是没改到
get:function(){} 为该属性设置监听事件,获取该属性值的时候触发,其return的值会作为该属性的值返回
set:function(){} 为该属性设置监听事件,设置该属性值的时候触发,参数为设置的值
如果在get中获取最新的属性值且不发生回调地狱,闭包设置一个变量存储最新值,也可以在原对象加个_sex私有属性存储最新的值,拿取的时候就不会调用sex的get方法
var obj = {
name:"李斯",
age:15,
}
function foo(){
let val; //形参本就是个变量,可直接使用
Object.defineProperty(obj,"sex", {
configurable:true,
set:function(value){
console.log('修改的值: ', value);
val = value;
},
get:function(){
console.log("闭包保留最新的值:",val);
return val
}
})
}
foo()
var sex = obj.sex
obj.sex = "未知"
var sex1 = obj.sex
注意:在浏览器打印对象,展开后点击对应属性的...会调用其get方法
定义多个属性描述符 Object.defineProperties(obj,{ name:{ },age:{ }})
如果属性描述的configurable,enumerable均为真 那么可以简写成以下形式
获取属性描述符的方法
对象禁用的三种方法:
1.下图增加对象属性不会报错(严格模式会) ,只是加不上去了,用defineProperty加会报错。只允许修改和删除
2.Object.seal(obj) 封闭一个对象,不能增加新属性,不能删除不能修改配置,但是可以修改属性的值
3.Object.freeze(obj) 禁止修改对象(也不能增加删除)对象冻结后, 没有办法再解冻, 只能通过克隆一个具有相同属性的新对象, 通过修改新对象的属性来达到目的