详解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编程起步(第六课)
Feb 27 Javascript
JQuery 网站换肤功能实现代码
Nov 02 Javascript
Extjs TriggerField在弹出窗口显示不出问题的解决方法
Jan 08 Javascript
javaScript 动态访问JSon元素示例代码
Aug 30 Javascript
IE6-8中Date不支持toISOString的修复方法
May 04 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
Sep 30 Javascript
JS中多种方式创建对象详解
Mar 22 Javascript
详解JavaScript中的自定义事件编写
May 10 Javascript
探讨AngularJs中ui.route的简单应用
Nov 16 Javascript
jQuery实现标签子元素的添加和赋值方法
Feb 24 jQuery
vscode配置vue下的es6规范自动格式化详解
Mar 20 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
Aug 03 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实现返回JSON和XML的类分享
2015/01/28 PHP
Laravel 5框架学习之路由、控制器和视图简介
2015/04/07 PHP
PHP实现UTF8二进制及明文字符串的转化功能示例
2017/11/20 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
图片动画横条广告带上下滚动的JS代码
2013/10/25 Javascript
javascript页面加载完执行事件代码
2014/02/11 Javascript
jQuery实现跟随鼠标运动图层效果的方法
2015/02/02 Javascript
原生js结合html5制作简易的双色子游戏
2015/03/30 Javascript
js实现交换运动效果的方法
2015/04/10 Javascript
jQuery实现的漂亮表单效果代码
2015/08/18 Javascript
jquery实现拖动效果
2016/08/10 Javascript
vue图片加载与显示默认图片实例代码
2017/03/16 Javascript
async/await地狱该如何避免详解
2018/05/10 Javascript
微信小程序首页的分类功能和搜索功能的实现思路及代码详解
2018/09/11 Javascript
微信小程序实现手势滑动卡片效果
2019/08/26 Javascript
JSX在render函数中的应用详解
2019/09/04 Javascript
[49:20]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
python装饰器与递归算法详解
2016/02/18 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
利用python实现短信和电话提醒功能的例子
2019/08/08 Python
python Web flask 视图内容和模板实现代码
2019/08/23 Python
python如何从文件读取数据及解析
2019/09/19 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
2021/01/27 Python
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
中国旅游网站:同程旅游
2016/09/11 全球购物
优秀学生获奖感言
2014/02/15 职场文书
老同学聚会感言
2014/02/23 职场文书
满月酒主持词
2014/03/27 职场文书
土建专业大学生自荐信范文
2014/04/09 职场文书
寄语学生的话
2014/04/10 职场文书
中学生励志演讲稿
2014/04/26 职场文书
社区禁毒工作方案
2014/06/02 职场文书
2015年度个人思想工作总结
2015/04/08 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书