详解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学习资源站点
Aug 29 Javascript
Underscore.js 的模板功能介绍与应用
Dec 24 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
Feb 28 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
Sep 05 Javascript
jQuery中常用动画效果函数知识点整理
Aug 19 jQuery
教你如何编写Vue.js的单元测试的方法
Oct 17 Javascript
js中事件对象和事件委托的介绍
Jan 21 Javascript
说说如何使用Vuex进行状态管理(小结)
Apr 14 Javascript
ES6知识点整理之Proxy的应用实例详解
Apr 16 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
Oct 31 Javascript
vue随机验证码组件的封装实现
Feb 19 Javascript
JavaScript架构localStorage特殊场景下二次封装操作
Jun 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桌面中心(三) 修改数据库
2007/03/11 PHP
PHP字符串 ==比较运算符的副作用
2009/10/21 PHP
php和javascript之间变量的传递实现代码
2012/12/19 PHP
Windows下编译PHP5.4和xdebug全记录
2015/04/03 PHP
PHP排序算法类实例
2015/06/17 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
2016/07/01 PHP
thinkPHP批量删除的实现方法分析
2016/11/09 PHP
javascript css float属性的特殊写法
2008/11/13 Javascript
通过event对象的fromElement属性解决热区设置主实体的一个bug
2008/12/22 Javascript
用jquery实现输入框获取焦点消失文字
2013/04/27 Javascript
利用ajaxfileupload插件实现文件上传无刷新的具体方法
2013/06/08 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
JS字符串的切分用法实例
2016/02/22 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
2016/05/16 Javascript
微信小程序(应用号)简单实例应用及实例详解
2016/09/26 Javascript
微信小程序  http请求封装详解及实例代码
2017/02/15 Javascript
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
解决vuejs 使用value in list 循环遍历数组出现警告的问题
2018/09/26 Javascript
Vue项目环境搭建详细总结
2019/09/26 Javascript
JavaScript TAB栏切换效果的示例
2020/11/05 Javascript
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
python的常见命令注入威胁
2013/02/18 Python
Python中几种操作字符串的方法的介绍
2015/04/09 Python
Django小白教程之Django用户注册与登录
2016/04/22 Python
Python实现购物车功能的方法分析
2017/11/10 Python
java中的控制结构(if,循环)详解
2019/06/26 Python
Python中pyecharts安装及安装失败的解决方法
2020/02/18 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
2020/06/10 Python
Python+unittest+requests 接口自动化测试框架搭建教程
2020/10/09 Python
Python使用grequests并发发送请求的示例
2020/11/05 Python
html5的canvas方法使用指南
2014/12/15 HTML / CSS
Java程序员面试题
2013/07/15 面试题
支部鉴定材料
2014/06/02 职场文书
党的作风建设心得体会
2014/10/22 职场文书
2016春节慰问信范文
2015/03/25 职场文书
MySQL池化框架学习接池自定义
2022/07/23 MySQL