详解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 XML数据显示为HTML一例
Dec 23 Javascript
document.documentElement和document.body区别介绍
Sep 16 Javascript
JS弹出层单纯的绝对定位居中示例代码
Feb 18 Javascript
JavaScript中判断整数的多种方法总结
Nov 08 Javascript
使用coffeescript编写node.js项目的方法汇总
Aug 05 Javascript
jQuery 1.9.1源码分析系列(十四)之常用jQuery工具
Dec 02 Javascript
原生JavaScript实现瀑布流布局
Jun 28 Javascript
javascript每日必学之条件分支
Feb 17 Javascript
微信小程序 ES6Promise.all批量上传文件实现代码
Apr 14 Javascript
javascript 开发之网页兼容各种浏览器
Sep 28 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
Jun 26 Javascript
JSX在render函数中的应用详解
Sep 04 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下使用CURL方式POST数据至API接口的代码
2013/02/14 PHP
PHP多文件上传实例
2015/07/09 PHP
PHP实现的回溯算法示例
2017/08/15 PHP
laravel 去掉index.php伪静态的操作方法
2019/10/12 PHP
javascript学习笔记(十二) RegExp类型介绍
2012/06/20 Javascript
jquery 选取方法都有哪些
2014/05/18 Javascript
js简单实现Select互换数据的方法
2015/08/17 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
2016/10/08 Javascript
javascript 数组去重复(在线去重工具)
2016/12/17 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
2017/08/16 Javascript
js利用递归与promise 按顺序请求数据的方法
2019/08/30 Javascript
Vue.js仿Select下拉框效果
2020/02/18 Javascript
JS eval代码快速解密实例解析
2020/04/23 Javascript
vue的hash值原理也是table切换实例代码
2020/12/14 Vue.js
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
python strip() 函数和 split() 函数的详解及实例
2017/02/03 Python
Python使用matplotlib简单绘图示例
2018/02/01 Python
Python设计模式之观察者模式原理与用法详解
2019/01/16 Python
python 搜索大文件的实例代码
2019/07/08 Python
python 异步async库的使用说明
2020/05/04 Python
Pytorch转onnx、torchscript方式
2020/05/25 Python
全网最细 Python 格式化输出用法讲解(推荐)
2021/01/18 Python
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
《小壁虎借尾巴》教学反思
2014/02/16 职场文书
大班开学家长寄语
2014/04/04 职场文书
电气工程及其自动化专业毕业生自荐信
2014/06/21 职场文书
我的中国梦演讲稿小学篇
2014/08/19 职场文书
环境保护建议书
2014/08/26 职场文书
2014年十八届四中全会思想汇报范文
2014/10/17 职场文书
幼儿园大班教师个人工作总结
2015/02/05 职场文书
幼儿园辞职信范文
2015/02/27 职场文书
2016新年感言
2015/08/03 职场文书
Pygame Event事件模块的详细示例
2021/11/17 Python
警用民用对讲机找不同
2022/02/18 无线电
Python内置包对JSON文件数据进行编码和解码
2022/04/12 Python