详解Vue源码之数据的代理访问


Posted in Javascript onDecember 11, 2018

概念解析:

1) 数据代理: 通过一个对象代理对另一个对象(在前一个对象内部)中属性的操作(读/写)
2) vue 数据代理: 通过 vm 对象(即this)来代理 data 对象中所有属性的操作
3) 好处: 更方便的操作 data 中的数据
4) 基本实现流程
a. 通过 Object.defineProperty()给 vm 添加与 data 对象的属性对应的属性描述符
b. 所有添加的属性都包含 getter/setter
c. getter/setter 内部去操作 data 中对应的属性数据

疑问

不知道你在使用Vue的时候有没有想过,为什么定义在 data 对象中的属性,可以用 Vue 的实例 this 进行访问?

我们来看看源码的实现。

var sharedPropertyDefinition = {
 enumerable: true,
 configurable: true,
 get: noop,
 set: noop
};

// 源码中是这样调用的:proxy(vm, '_data', key)
// vm是Vue的实例,key是data对象属性的名字
function proxy (target, sourceKey, key) {
 sharedPropertyDefinition.get = function proxyGetter () {
  return this[sourceKey][key]
 };
 sharedPropertyDefinition.set = function proxySetter (val) {
  this[sourceKey][key] = val;
 };
 Object.defineProperty(target, key, sharedPropertyDefinition);
}

比如有个如下demo

const vm = new Vue({
  el: '#app',
  data: { message: 'Hello Vue!' },
  created() {
    console.log(this.message)      // 输出Hello Vue!
    console.log(this._data.message)   // 同样输出Hello Vue!
  }
})

也就是说当我们这样 this.message 写的时候, Vue 通过 Object.defineProperty 给 this.message 设置一层代理,实际访问的是 this._data 里的 message 属性,而 this._data 指向的对象就是我们写的 data 对象。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 高级语法介绍
Jun 15 Javascript
jQuery数组处理代码详解(含实例演示)
Feb 03 Javascript
js实现类似菜单风格的TAB选项卡效果代码
Aug 28 Javascript
JavaScript编写一个简易购物车功能
Sep 17 Javascript
原生js实现轮播图的示例代码
Feb 20 Javascript
angularjs ui-router中路由的二级嵌套
Mar 10 Javascript
JavaScript操作文件_动力节点Java学院整理
Jun 30 Javascript
对angular 实时更新模板视图的方法$apply详解
Oct 09 Javascript
js实现弹出框的拖拽效果实例代码详解
Apr 16 Javascript
Vue 列表上下过渡效果的实例代码
Jun 25 Javascript
CountUp.js实现数字滚动增值效果
Oct 17 Javascript
微信小程序自定义支持图片的弹窗
Dec 21 Javascript
浅谈Vue 性能优化之深挖数组
Dec 11 #Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
Dec 11 #Javascript
Vue入门之数量加减运算操作示例
Dec 11 #Javascript
简单的React SSR服务器渲染实现
Dec 11 #Javascript
Vuex 单状态库与多模块状态库详解
Dec 11 #Javascript
微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
Dec 11 #Javascript
微信小程序实现两个页面传值的方法分析
Dec 11 #Javascript
You might like
自制PHP框架之设计模式
2017/05/07 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
2017/11/03 PHP
PHP实现 APP端微信支付功能
2018/06/22 PHP
基于jquery的滑动样例代码
2010/11/20 Javascript
jQuery的each终止或跳过示例代码
2013/12/12 Javascript
JavaScript自定义等待wait函数实例分析
2015/03/23 Javascript
jQuery使用hide方法隐藏元素自身用法实例
2015/03/30 Javascript
jQuery.ajax向后台传递数组问题的解决方法
2017/05/12 jQuery
详解如何用模块化的方式写vuejs
2017/12/16 Javascript
jquery.picsign图片标注组件实例详解
2018/02/02 jQuery
微信小程序开发之改变data中数组或对象的某一属性值
2018/07/05 Javascript
JavaScript设计模式之代理模式实例分析
2019/01/16 Javascript
vue引用外部JS的两种种方法
2020/01/28 Javascript
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
[52:52]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第三局
2016/02/27 DOTA
[02:42]岂曰无衣,与子同袍!DOTA2致敬每一位守护人
2020/02/17 DOTA
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
python3新特性函数注释Function Annotations用法分析
2016/07/28 Python
浅谈Python中的作用域规则和闭包
2018/03/20 Python
Python 实现Windows开机运行某软件的方法
2018/10/14 Python
Python numpy.array()生成相同元素数组的示例
2018/11/12 Python
PyQt5响应回车事件的方法
2019/06/25 Python
python3.7实现云之讯、聚合短信平台的短信发送功能
2019/09/26 Python
python3发送request请求及查看返回结果实例
2020/04/30 Python
Python Json数据文件操作原理解析
2020/05/09 Python
CSS3轻松实现清新 Loading 效果的简单实例
2016/06/06 HTML / CSS
澳大利亚领先的武术用品和健身器材供应商:SMAI
2019/03/24 全球购物
声明struct x1 { . . . }; 和typedef struct { . . . }x2;有什么不同
2012/06/02 面试题
英文版网络工程师求职信
2013/10/28 职场文书
物业公司采购员岗位职责
2013/12/31 职场文书
美术教师岗位职责
2014/03/18 职场文书
会计工作能力自我评价
2015/03/05 职场文书
二胎满月酒致辞
2015/07/29 职场文书
班干部竞选演讲稿(精选5篇)
2019/09/24 职场文书
python实现剪贴板的操作
2021/07/01 Python
Python安装使用Scrapy框架
2022/04/12 Python