【Vue笔记】Vue入门简介_数据代理(03)
Page content
1.Object.defineproperty
理解数据代理之前,先需要理解Object.defineProperty
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script type="text/javascript">
let number = 18;
let Person = {
name: "小明",
address: "北京"
}
Object.defineProperty(Person, "age", {
// value:18,
// enumerable: true,//控制属性是否可以枚举,默认false 不能在对象遍历中查看
// writable:true, //控制属性是否能修改,默认false
// configurable:true, //控制属性是否能删除,默认false
//当读取Person age属性时,get函数(getter)会被调用,且返回age值。
get: function () {
console.log('取age值');
return number;
},
//当修改Person age属性时,set函数(setter)会被调用,且传入的参数是新的age值。
set(value) {
console.log('修改age值:', value);
number = value;
}
})
</script>
</body>
</html>
2.数据代理
基于上述的Object.defineproperty功能,我们继续了解一下数据代理。
通过一个对象代理对另一个对象中属性的(读写)操作。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<!-- 通过obj2 代理 obj1 的 数据 -->
<script type="text/javascript">
let obj1 = { x: 10 }
let obj2 = { y: 20 }
Object.defineProperty(obj2, 'x', {
get: function () {
return obj1.x;
},
set: function (value) {
obj1.x = value
}
})
console.log(obj1)
console.log(obj2)
</script>
</body>
</html>
3.Vue中的数据代理
3.1 Vue中的数据代理
通过vm对象来代理data对象中属性(读写)操作
3.2 Vue中数据代理的好处
更方便的操作data中的数据
3.3 基本原理
通过Object.defineProperty()把data对象中的所有属性添加到vm上
为每一个添加到vm上的属性,都会有一个getter和一个setter
在getter/setter内部去操作data对象中的属性
3.4 实现数据代理的原理
3.5 代码实例
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="../js/vue.js" type="text/javascript" charset="uft-8"></script>
</head>
<body>
<div id="app">
<h3>姓名:{{name}}</h3>
<h3>年龄:{{age}}</h3>
</div>
<script type="text/javascript">
Vue.config.productionTip = false;
let aa = {
name: '小明',
age: 18
};
//vm._data 为vue实例对象的data属性
const vm = new Vue({
el: '#app',
// data: {
// name: '小明',
// age: 18
// }
data: aa
});
</script>
</body>
</html>
欢迎大家的意见和交流
email: li_mingxie@163.com