详解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 相关文章推荐
JS修改css样式style浅谈
May 06 Javascript
js控制iframe的高度/宽度让其自适应内容
Apr 09 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
Jan 13 Javascript
javascript实现倒计时并弹窗提示特效
Jun 05 Javascript
JavaScript中实现map功能代码分享
Jun 11 Javascript
分享我的jquery实现下拉菜单心的
Nov 29 Javascript
js 弹出虚拟键盘修改密码的简单实例
Oct 10 Javascript
学习vue.js条件渲染
Dec 03 Javascript
js 判断数据类型的几种方法
Jan 13 Javascript
深入理解React高阶组件
Sep 28 Javascript
Javascript异步执行不按顺序解决方案
Apr 30 Javascript
JavaScript常用工具函数大全
May 06 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
php5 图片验证码实现代码
2009/12/11 PHP
关于PHP开发的9条建议
2015/07/27 PHP
PHP去掉json字符串中的反斜杠\及去掉双引号前的反斜杠
2015/09/30 PHP
通过jQuery源码学习javascript(一)
2012/12/27 Javascript
js+html+css实现鼠标移动div实例
2013/01/30 Javascript
js子页面获取父页面数据示例
2014/05/15 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
jquery获取选中的文本和值的方法
2014/07/08 Javascript
JS实现图片无间断滚动代码汇总
2014/07/30 Javascript
原生javascript实现拖动元素示例代码
2014/09/01 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
js实现简洁的滑动门菜单(选项卡)效果代码
2015/09/04 Javascript
JS日期加减,日期运算代码
2015/11/05 Javascript
BootStrap智能表单实战系列(六)表单编辑页面的数据绑定
2016/06/13 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
用vue构建多页面应用的示例代码
2017/09/20 Javascript
如何让node运行es6模块文件及其原理详解
2018/12/11 Javascript
如何在Angular8.0下使用ngx-translate进行国际化配置
2019/07/24 Javascript
python用Pygal如何生成漂亮的SVG图像详解
2017/02/10 Python
Python中optparser库用法实例详解
2018/01/26 Python
使用实现XlsxWriter创建Excel文件并编辑
2018/05/04 Python
对python中array.sum(axis=?)的用法介绍
2018/06/28 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
2019/10/17 Python
Numpy实现卷积神经网络(CNN)的示例
2020/10/09 Python
送给他或她的礼物:FUN.com
2018/08/17 全球购物
写好自荐信的要点
2013/11/06 职场文书
大学生收银员求职信分享
2014/01/02 职场文书
积极贯彻学习两会精神总结
2014/03/17 职场文书
人力资源管理专业自荐信
2014/06/24 职场文书
党支部创先争优活动总结
2014/08/28 职场文书
卖房授权委托书样本
2014/10/05 职场文书
2015年幼儿园安全工作总结
2015/05/12 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书
企业内部管理控制:采购授权审批制度范本
2020/01/19 职场文书
python用tkinter开发的扫雷游戏
2021/06/01 Python