详解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 相关文章推荐
jQuery 开发者应该注意的9个错误
May 03 Javascript
indexOf 和 lastIndexOf 使用示例介绍
Sep 02 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
Feb 26 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
Sep 01 Javascript
jQuery div拖拽用法实例
Jan 14 Javascript
jQuery EasyUi实战教程之布局篇
Jan 26 Javascript
关于数据与后端进行交流匹配(点亮星星)
Aug 03 Javascript
微信和qq时间格式模板实例详解
Oct 21 Javascript
Angular使用$http.jsonp发送跨站请求的方法
Mar 16 Javascript
React router动态加载组件之适配器模式的应用详解
Sep 12 Javascript
微信小程序实现留言板
Oct 31 Javascript
React 组件渲染和更新的实现代码示例
Feb 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
论建造顺序的重要性
2020/03/04 星际争霸
Sony CFR 320 修复改造
2020/03/14 无线电
Admin generator, filters and I18n
2011/10/06 PHP
php实现文本数据导入SQL SERVER
2015/05/17 PHP
PHP简单获取及判断提交来源的方法
2016/04/22 PHP
PHP文件上传操作实例详解
2016/09/27 PHP
JQUERY CHECKBOX全选,取消全选,反选方法三
2008/08/30 Javascript
IE DOM实现存在的部分问题及解决方法
2009/07/25 Javascript
JavaScript 基于原型的对象(创建、调用)
2009/10/16 Javascript
JavaScript 函数参数是传值(byVal)还是传址(byRef) 分享
2013/07/02 Javascript
使用jspdf生成pdf报表
2015/07/03 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
JavaScript中的this到底是什么(一)
2015/12/09 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
2016/05/31 Javascript
Jquery-data的三种用法
2017/04/18 jQuery
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
layer弹出层全屏及关闭方法
2018/08/17 Javascript
Vue服务端渲染实践之Web应用首屏耗时最优化方案
2019/03/22 Javascript
Vue3 的响应式和以前有什么区别,Proxy 无敌?
2020/05/20 Javascript
使用Python生成XML的方法实例
2017/03/21 Python
Python 获得命令行参数的方法(推荐)
2018/01/24 Python
Python实现合并excel表格的方法分析
2019/04/13 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
Python 2种方法求某个范围内的所有素数(质数)
2020/01/31 Python
手把手教你从PyCharm安装到激活(最新激活码),亲测有效可激活至2089年
2020/11/25 Python
css3中检验表单的required,focus,valid和invalid样式
2014/02/21 HTML / CSS
html5仿支付宝密码框的实现代码
2017/09/06 HTML / CSS
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
全球领先美式家具品牌:Ashley爱室丽家居
2017/08/07 全球购物
校长寄语大全
2014/04/09 职场文书
公司担保书范文
2014/05/21 职场文书
安全生产隐患排查制度
2015/08/05 职场文书
2016年学习贯彻十八届五中全会精神心得体会
2016/01/05 职场文书
创业计划书之家教中心
2019/09/25 职场文书
导游词之介休绵山
2019/12/31 职场文书
mysql函数全面总结
2021/11/11 MySQL