数据代理

1. 数据代理

通过一个对象代理另一个对象中的属性的操作(读 / 写 )

vue 数据代理: 通过vm对象来代理data中所有属性的操作,更方便操作data中的数据

对应案例:

<!doctype html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport"
		  content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>Document</title>
</head>
<body>
<div id="app">

</div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.7/vue.min.js"></script>
<script>
	const vm = new Vue({
		el:'#app',
		data:{
			username: 'doudou'
		}
	});
	// vm 代理data
	console.log(vm.username);  // doudou
</script>
</body>
</html>

源码解析:

function MVVM(options) {
    // 将选项对象保存到vm
    this.$options = options;
    // 将data对象保存到vm和data变量中
    var data = this._data = this.$options.data;
    //将vm保存在me变量中
    var me = this;
    // 遍历data中所有属性
    Object.keys(data).forEach(function (key) { // 属性名: name
        // 对指定属性实现代理
        me._proxy(key);
    });

    // 对data进行监视
    observe(data, this);

    // 创建一个用来编译模板的compile对象
    this.$compile = new Compile(options.el || document.body, this)
}

MVVM.prototype = {
    $watch: function (key, cb, options) {
        new Watcher(this, key, cb);
    },

    // 对指定属性实现代理
    _proxy: function (key) {
        // 保存vm
        var me = this;
        // 给vm添加指定属性名的属性(使用属性描述)
        Object.defineProperty(me, key, {
            configurable: false, // 不能再重新定义
            enumerable: true, // 可以枚举
            // 当通过vm.name读取属性值时自动调用
            get: function proxyGetter() {
                // 读取data中对应属性值返回(实现代理读操作)
                return me._data[key];
            },
            // 当通过vm.name = 'xxx'时自动调用
            set: function proxySetter(newVal) {
                // 将最新的值保存到data中对应的属性上(实现代理写操作)
                me._data[key] = newVal;
            }
        });
    }
};
2. 基实现流程

(1)通过 Object.defineProperty()给 vm 添加与 data 对象的属性对应的属性描述符
(2)所有添加的属性都包含 getter/setter
(3) getter/setter 内部去操作 data 中对应的属性数据

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值