详解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中的new使用
Mar 20 Javascript
jQuery中after的两种用法实例
Jul 03 Javascript
文本框水印提示效果的简单实现代码
Feb 22 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
Oct 28 Javascript
使用npm发布Node.JS程序包教程
Mar 02 Javascript
input 禁止输入特殊字符的四种实现方式
Aug 24 Javascript
JavaScript中 this 指向问题深度解析
Feb 21 Javascript
Bootstrap Scrollspy源码学习
Mar 02 Javascript
angular.js中解决跨域问题的三种方式
Jul 12 Javascript
jquery 获取索引值在一定范围的列表方法
Jan 25 jQuery
React styled-components设置组件属性的方法
Aug 07 Javascript
js实现移动端tab切换时下划线滑动效果
Sep 08 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
世界上第一台立体声收音机
2021/03/01 无线电
PHP获取浏览器信息类和客户端地理位置的2个方法
2014/04/24 PHP
php插入排序法实现数组排序实例
2015/02/16 PHP
简单的pgsql pdo php操作类实现代码
2016/08/25 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
2019/10/08 PHP
window.open以post方式将内容提交到新窗口
2012/12/26 Javascript
js写的评论分页(还不错)
2013/12/23 Javascript
iframe的onreadystatechange事件在firefox下的使用
2014/04/16 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
js实现select二级联动下拉菜单
2020/04/17 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
2017/12/19 Javascript
nodejs实现的简单web服务器功能示例
2018/03/15 NodeJs
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
详解KOA2如何手写中间件(装饰器模式)
2018/10/11 Javascript
使用Vue做一个简单的todo应用的三种方式的示例代码
2018/10/20 Javascript
Vue 自定义指令实现一键 Copy功能
2019/09/16 Javascript
解决Vue.js应用回退或刷新界面时提示用户保存修改问题
2019/11/24 Javascript
JS实现“全选”和"全不选"功能代码实例
2020/02/06 Javascript
Javascript异步编程async实现过程详解
2020/04/02 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
vue移动端下拉刷新和上滑加载
2020/10/27 Javascript
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
Python def函数的定义、使用及参数传递实现代码
2014/08/10 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
2018/08/01 Python
情人节快乐! python绘制漂亮玫瑰
2020/08/18 Python
VSCode中自动为Python文件添加头部注释
2019/11/14 Python
python 消费 kafka 数据教程
2019/12/21 Python
Fashion Eyewear美国:英国线上设计师眼镜和太阳镜的零售商
2016/08/15 全球购物
澳洲国民品牌乡村路折扣店:Country Road & Trenery Outlet
2018/04/19 全球购物
编写函数,将一个3*3矩阵转置
2013/10/09 面试题
Windows和Linux动态库应用异同
2016/07/28 面试题
美德少年事迹材料500字
2014/08/19 职场文书
政府个人对照检查材料
2014/08/28 职场文书
史上最全书信经典范文大全(建议收藏)
2019/07/10 职场文书