重点:Object.defineProperty方法是Vue数据双向绑定原理的常见面试题
Object.defineProperty方法,直接在一个对象上新增一个属性,或者修改一个已存在的属性。
1.Object.defineProperty方法的参数
Object.defineProperty 需要三个参数(object , propName , descriptor)
- object:必须,要在其上添加或修改属性的对象。
- propertyname:必需。 一个包含属性名称的字符串。
- descriptor: 属性描述符。 它可以针对数据属性或访问器属性
descriptor的属性:- enumerable//控制属性是否可以被删除(遍历),默认false;
- writable,//控制属性是否可以被修改,默认false;
- configurable,//控制属性是否可以被删除,默认false;
2.属性的设置与修改
set: 目标属性设置值的方法
get:目标属性获取值的方法
注意:当使用了getter或setter方法,不允许使用writable和value这两个属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="../js/vue.js"></script>
</head>
<body>
<!--容器-->
<div id="root">
</div>
<script type="text/javascript">
Vue.config.productionTip = false
//创建vue实例
let person ={
name:'css',
sex:'男',
// age:18
}
Object.defineProperty(person,'age', {
// value: 18,
// enumerable: true,//控制属性是否可以被删除(遍历),默认false
// writable: true,//控制属性是否可以被修改,默认false
// configurable: true,//控制属性是否可以被删除,默认false
//当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
get() {
console.log('有人读取age属性了')
return number
},
//当有人修改person的age属性时,set图 数(setter)就会被调用,且会收到修改的具体值
set(value){
console.log('有人修改了age属性,且值是value')
number =value
}
})
</script>
</body>
</html>