详解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 用Node.js写Shell脚本[译]
Sep 20 Javascript
jQuery中 prop() attr()使用详解
May 19 Javascript
Angular中$compile源码分析
Jan 28 Javascript
基于JS实现导航条flash导航条
Jun 17 Javascript
Angular工具方法学习
Dec 26 Javascript
jQuery中的siblings()是什么意思(推荐)
Dec 29 Javascript
JavaScript自定义分页样式
Jan 17 Javascript
vue项目国际化vue-i18n的安装使用教程
Mar 14 Javascript
解决vue 引入子组件报错的问题
Sep 06 Javascript
webpack3.0升级4.0的方法步骤
Apr 02 Javascript
详解vue 组件的实现原理
Nov 12 Javascript
如何使用JavaScript策略模式校验表单
Apr 29 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下统计用户在线时间的一种尝试
2010/08/26 PHP
php中判断文件空目录是否有读写权限的函数代码
2012/08/07 PHP
php读取文件内容的方法汇总
2015/01/24 PHP
PHP 验证登陆类分享
2015/03/13 PHP
php关键字仅替换一次的实现函数
2015/10/29 PHP
PHP实现的浏览器检查类
2016/04/11 PHP
jquery 注意事项与常用语法小结
2010/06/07 Javascript
js字符编码函数区别分析
2011/12/28 Javascript
jQuery中ajax的load()方法用法实例
2014/12/26 Javascript
JQuery中属性过滤选择器用法实例分析
2015/05/18 Javascript
BootstrapTable+KnockoutJS自定义T4模板快速生成增删改查页面
2016/08/01 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
jQuery中内容过滤器简单用法示例
2018/03/31 jQuery
vue-cli3 引入 font-awesome的操作
2020/08/11 Javascript
Python中的CURL PycURL使用例子
2014/06/01 Python
Python使用py2exe打包程序介绍
2014/11/20 Python
简单介绍Python中的JSON使用
2015/04/28 Python
Python使用plotly绘制数据图表的方法
2017/07/18 Python
对Python 内建函数和保留字详解
2018/10/15 Python
Python、 Pycharm、Django安装详细教程(图文)
2019/04/12 Python
Django框架验证码用法实例分析
2019/05/10 Python
python实现小程序推送页面收录脚本
2020/04/20 Python
使用K.function()调试keras操作
2020/06/17 Python
python利用paramiko实现交换机巡检的示例
2020/09/22 Python
美国男女折扣服饰百货连锁店:Stein Mart
2017/05/02 全球购物
选购世界上最好的美妆品:Cult Beauty
2017/11/03 全球购物
一级方程式赛车官方网上商店:F1 Store(支持中文)
2018/01/12 全球购物
数据库笔试题
2013/05/09 面试题
汽车工程专业应届生求职信
2013/10/19 职场文书
电大毕业生自我鉴定
2013/11/10 职场文书
小孩百日宴答谢词
2014/01/15 职场文书
机关作风建设整改方案
2014/10/27 职场文书
郭明义观后感
2015/06/08 职场文书
2016小学新学期寄语
2015/12/04 职场文书
《半截蜡烛》教学反思
2016/02/19 职场文书
python数字图像处理之图像自动阈值分割示例
2022/06/28 Python