详解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 相关文章推荐
JTrackBar水平拖动效果
Jul 15 Javascript
JavaScript获取GridView选择的行内容
Apr 14 Javascript
30个最好的jQuery 灯箱插件分享
Apr 25 Javascript
JavaScript运行时库属性一览表
Mar 14 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
Aug 05 Javascript
JS实现显示带倒影的图片横排居中放大展示特效实例【测试可用】
Aug 23 Javascript
微信小程序 数据交互与渲染实例详解
Jan 21 Javascript
jquery Ajax实现Select动态添加数据
Jun 08 jQuery
用React-Native+Mobx做一个迷你水果商城APP(附源码)
Dec 25 Javascript
vuex 项目结构目录及一些简单配置介绍
Apr 08 Javascript
Vue中常用rules校验规则(实例代码)
Nov 14 Javascript
vue相关配置文件详解及多环境配置详细步骤
May 19 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编程最快明白》第八讲:php启发和小结
2010/11/01 PHP
PHP使用静态方法的几个注意事项
2014/09/16 PHP
php格式化日期实例分析
2014/11/12 PHP
浅谈php优化需要注意的地方
2014/11/27 PHP
屏蔽Flash右键信息的js代码
2010/01/17 Javascript
javascript重复绑定事件造成的后果说明
2013/03/02 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
2014/01/02 Javascript
深入理解事件冒泡(Bubble)和事件捕捉(capture)
2016/05/28 Javascript
js动态添加的DIV中的onclick事件简单实例
2016/07/25 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
layui文件上传实现代码
2017/05/20 Javascript
JavaScript实现元素滚动条到达一定位置循环追加内容
2017/12/28 Javascript
Vue自定义弹窗指令的实现代码
2018/08/13 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
2020/06/04 Javascript
Vue scoped及deep使用方法解析
2020/08/01 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
python 运算符 供重载参考
2009/06/11 Python
使用Python3编写抓取网页和只抓网页图片的脚本
2015/08/20 Python
Python解析json文件相关知识学习
2016/03/01 Python
Pycharm设置utf-8自动显示方法
2019/01/17 Python
python 实现将多条曲线画在一幅图上的方法
2019/07/07 Python
Pandas中DataFrame基本函数整理(小结)
2020/07/20 Python
Django静态文件加载失败解决方案
2020/08/26 Python
天猫国际进口超市直营:官方直采,一站购齐
2017/12/11 全球购物
北京天润融通.net面试题笔试题
2012/02/20 面试题
进修护士自我鉴定
2013/10/14 职场文书
2014新课程改革心得体会
2014/03/10 职场文书
市场营销专业毕业生求职信
2014/07/21 职场文书
求职简历自我评价范文
2015/03/10 职场文书
2015年十一国庆节演讲稿
2015/03/20 职场文书
党员电教片《信仰》心得体会
2016/01/15 职场文书
详解CSS伪元素的妙用单标签之美
2021/05/25 HTML / CSS
MySQL系列之八 MySQL服务器变量
2021/07/02 MySQL
php将xml转化对象的实例详解
2021/11/17 PHP
html5调用摄像头截图功能
2022/01/18 Javascript
golang操作redis的客户端包有多个比如redigo、go-redis
2022/04/14 Golang