详解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 ajax return没有返回值的解决方法
Oct 20 Javascript
Jquery validation remote 验证的缓存问题解决方法
Mar 25 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
Jan 18 Javascript
基于JS代码实现实时显示系统时间
Jun 16 Javascript
jQuery ready()和onload的加载耗时分析
Sep 08 Javascript
快速入门Vue
Dec 19 Javascript
js实现兼容PC端和移动端滑块拖动选择数字效果
Feb 16 Javascript
微信小程序 聊天室简单实现
Apr 19 Javascript
利用forever和pm2部署node.js项目过程
May 10 Javascript
vue图片上传本地预览组件使用详解
Feb 20 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
Sep 06 Javascript
JavaScript实现10秒后再次获取验证码
Dec 02 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
ADODB类使用
2006/11/25 PHP
PHP远程连接MYSQL数据库非常慢的解决方法
2008/07/05 PHP
使用PHP实现微信摇一摇周边红包
2016/01/04 PHP
CI(CodeIgniter)框架实现图片上传的方法
2017/03/24 PHP
PHP 年月日的三级联动实例代码
2017/05/24 PHP
javascript 动态添加表格行
2006/06/22 Javascript
Ctrl+Enter提交内容信息
2006/06/26 Javascript
检测是否已安装 .NET Framework 3.5的js脚本
2009/02/14 Javascript
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
ie支持function.bind()方法实现代码
2012/12/27 Javascript
jquery.post用法示例代码
2014/01/03 Javascript
简单的js图片轮换代码(js图片轮播)
2014/05/06 Javascript
avascript中的自执行匿名函数应用示例
2014/09/15 Javascript
IE和Firefox之间在JavaScript语法上的差异
2016/04/22 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
JavaScript代码实现图片循环滚动效果
2020/03/19 Javascript
vue.js 表格分页ajax 异步加载数据
2016/10/18 Javascript
jQuery验证表单格式的使用方法
2017/01/10 Javascript
浅谈JavaScript中promise的使用
2017/01/11 Javascript
nodejs 图解express+supervisor+ejs的用法(推荐)
2017/09/08 NodeJs
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
Js经典案例的实例代码
2018/05/10 Javascript
js如何实现元素曝光上报
2019/08/07 Javascript
[44:01]2018DOTA2亚洲邀请赛3月30日 小组赛B组 EG VS paiN
2018/03/31 DOTA
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
不可错过的十本Python好书
2017/07/06 Python
python实现贪吃蛇小游戏
2020/03/21 Python
Python 学习教程之networkx
2019/04/15 Python
Django中ORM外键和表的关系详解
2019/05/20 Python
python opencv角点检测连线功能的实现代码
2020/11/24 Python
详解CSS3+JS完美实现放大镜模式
2020/12/03 HTML / CSS
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
TUMI马来西亚官方网站:国际领先的高品质商旅箱包品牌
2018/04/26 全球购物
党员创先争优活动总结
2014/05/04 职场文书
篮球赛口号
2014/06/18 职场文书
Android开发之WECHAT微信小程序路由跳转的两种形式
2022/04/12 Java/Android