详解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 Tools tab(幻灯片)
Jul 14 Javascript
jQuery原理系列-常用Dom操作详解
Jun 07 Javascript
JS克隆,属性,数组,对象,函数实例分析
Nov 26 Javascript
微信小程序之小豆瓣图书实例
Nov 30 Javascript
vue.js全局API之nextTick全面解析
Jul 07 Javascript
vue绑定设置属性的多种方式(5)
Aug 16 Javascript
JS库之Waypoints的用法详解
Sep 13 Javascript
详解vue项目打包后通过百度的BAE发布到网上的流程
Mar 05 Javascript
Webpack path与publicPath的区别详解
May 03 Javascript
仿vue-cli搭建属于自己的脚手架的方法步骤
Apr 17 Javascript
vue实现菜单切换功能
May 08 Javascript
vue项目创建步骤及路由router
Jan 14 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
为什么那些咖啡爱好者大多看不上连锁咖啡店?
2021/03/06 咖啡文化
做个自己站内搜索引擎
2006/10/09 PHP
浅谈Eclipse PDT调试PHP程序
2014/06/09 PHP
基础的prototype.js常用函数及其用法
2007/03/10 Javascript
prototype与jquery下Ajax实现的差别
2009/09/13 Javascript
JavaScript浏览器选项卡效果
2010/08/25 Javascript
按钮JS复制文本框和表格的代码
2011/04/01 Javascript
利用jQuery操作对象数组的实现代码
2011/04/27 Javascript
对javascript的一点点认识总结《javascript高级程序设计》读书笔记
2011/11/30 Javascript
jquery图片放大镜功能的实例代码
2013/03/26 Javascript
javascript实现textarea中tab键的缩排处理方法
2015/06/26 Javascript
jquery实现列表上下移动功能
2016/02/25 Javascript
jQuery用FormData实现文件上传的方法
2016/11/21 Javascript
详解javascript中的变量提升和函数提升
2018/05/24 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
Layui 数据表格批量删除和多条件搜索的实例
2019/09/04 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
2020/01/06 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
2020/12/14 Vue.js
为Python的web框架编写前端模版的教程
2015/04/30 Python
pyqt5自定义信号实例解析
2018/01/31 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
python ChainMap 合并字典的实现步骤
2019/06/11 Python
Python+threading模块对单个接口进行并发测试
2019/06/25 Python
HTML5新增的标签和属性归纳总结
2018/05/02 HTML / CSS
豆腐の盛田屋官网:日本自然派的豆乳面膜、肥皂、化妆水、乳液等
2016/10/08 全球购物
澳洲网红粉泥面膜:Sand & Sky
2019/08/13 全球购物
中职应届生会计求职信
2013/10/23 职场文书
村委会主任先进事迹
2014/01/15 职场文书
大学生职业生涯规划书模板
2014/01/18 职场文书
服装采购员岗位职责
2014/03/15 职场文书
矿泉水广告词
2014/03/20 职场文书
单位工作证明
2014/10/07 职场文书
人事局接收函
2015/01/31 职场文书
详解Django中 render() 函数的使用方法
2021/04/22 Python
Java Socket实现Redis客户端的详细说明
2021/05/26 Redis
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS