一、Object.defineProperty方法
Object.defineProperty用来给对象定义属性,用这个方法定义的属性比较灵活。
1. Object.defineProperty的基础配置项
let per = {
name: 'rj',
country: '中国'
}
// 使用Object.defineProperty方法给per对象添加一个属性
Object.defineProperty(per,'age',{
value: '18', //配置新增属性的值
enumerable: true, //控制属性是否可以被枚举,默认为false
writable: true, //控制属性书否可以被修改,默认为false
configurable: true //控制属性是否可以被删除
})
2. getter和setter
- 当属性被访问时,getter就会被调用
- 当属性被修改时,setter就会被调用
let number = 18
let per = {
name: 'rj',
country: '中国'
}
// 使用Object.defineProperty方法给per对象添加一个属性
Object.defineProperty(per, 'age', {
//可简写为 get(){}
get: function () {
console.log('有人读取age了~');
return number
},
//有人修改age属性时,setter会被调用
set(value){
console.log('有人修改age了!')
number = value
}
})
二、数据代理
1. 什么是数据代理
通过一个对象代理对另一个对象中的属性进行操作(读/写)。
let obj = {x:100}
let obj2 = {y:200}
// 通过obj2来操作obj的x属性
Object.defineProperty(obj2,'x',{
get(){
return obj.x
},
set(value){
obj.x = value
}
})
三、Vue中的数据代理
- Vue中的数据代理:通过vm来代理data中属性的操作
- Vue中数据代理的好处:更加方便的操作data中的数据
- 基本原理:
通过Object.defineProperty()方法将data中的属性添加到vm身上。
为每个添加到vm身上的属性指定getter和setter。
在getter和setter内部操作data的属性。