vue源码学习(第一张)this访问data数据

前言

本文章,为了让大家理解为什么我们实例化Vue对象中我们可以用this来访问data中的数据。这里我们大部分都是用的源码,简化的部分很少,但是还是有所修剪。

我们使用的函数

Vue Vue对象
initData 初始化我们的data数据
getData 如果data是函数的话我们用此方法来取得函数的返回值
proxy 实现this指向的函数
// Vue对象
function Vue(options) {this.initData(options)
}// 初始化我们的data数据
Vue.prototype.initData = (vm) => {let data = vm.datadata = vm._data = typeof data === 'function'? getData(data, vm): data || {}let keys = Object.keys(data)for (const item in keys) {proxy(vm,'_data', keys)}
}// 如果data是函数的话我们用此方法来取得函数的返回值
function getData(data, vm) {return data.call(vm,vm)
}// 实现this指向的函数
let sharedPropertyDefinition = {}
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)
}

每个函数的初步讲解

Vue函数

这个函数没什么好讲的,他只是调用了许多的方法来初始化,渲染等我们的传入的数据

initData

// Vue对象
function Vue(options) {this.initData(options)
}// 初始化我们的data数据
Vue.prototype.initData = (vm) => {let data = vm.datadata = vm._data = typeof data === 'function'? getData(data, vm): data || {}let keys = Object.keys(data)for (const item in keys) {proxy(vm,'_data', keys)}
}
const vue = new Vue({data(){return {sdaasd: 'asdasd'}}
})

在我们实例化Vue函数的时候,我们同时调用了绑定在Vue函数原型上的initData函数。

首先定义了一个data变量来保存我们实例化Vue传入的options中的data

data = vm._data = typeof data === 'function'? getData(data, vm): data || {}

这个data数据不仅仅保存在了我们的函数中他还挂在在了vm对象上。这个语句做出了一个判断,如果是data是对象的话我们直接拿到他的数据就好,如果不是对象是个函数,那我们就执行getData这个函数

为什么这么做呢?

是为了防止Object.defineProperty这个API的死循环,用过的都知道如果set中返回的还是自己get中的数据那么他就又会执行get,这样无限的死循环,非常难受。

function getData(data, vm) {return data.call(vm,vm)
}

他其实也就是一个call方法执行了一下函数拿到了返回值。

然后我们创建了keys变量来保存data中所有的键。并执行proxy()函数

let sharedPropertyDefinition = {}
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)
}proxy(vm,'_data', keys)

我们通过传参看看proxy()函数做了什么。

他的getset方法实际上是改变了this访问时的指向,如果你知道Object.defineProperty这个api到这里其实你已经明白他的原理了,他就是给每个变量做了代理。

vue源码学习(第一张) this访问data数据 拆散之后并不难相关推荐

  1. VUE源码学习第一篇--前言

    一.目的 前端技术的发展,现在以vue,react,angular为代表的MVVM模式以成为主流,这三个框架大有三分天下之势.react和angular有facebook与谷歌背书,而vue是以一己之 ...

  2. vue源码学习--vue源码学习入门

    本文为开始学习vue源码的思路整理.在拿到vue项目源码的之后看到那些项目中的文件夹,会很困惑,不知道每个文件夹内的世界,怎么变换,怎样的魔力,最后产生了vue框架.学习源码也无从学起.我解决了这些困 ...

  3. Vue源码学习之Computed与Watcher原理

    前言  computed与watch是我们在vue中常用的操作,computed是一个惰性求值观察者,具有缓存性,只有当依赖发生变化,第一次访问computed属性,才会计算新的值.而watch则是当 ...

  4. Vue源码学习 - 准备工作

    Vue源码学习 - 准备工作 准备工作 认识Flow 为什么用 Flow Flow 的工作方式 类型推断 类型注释 数组 类和对象 null Flow 在 Vue.js 源码中的应用 flow实践 总 ...

  5. Vue源码学习 - 组件化(三) 合并配置

    Vue源码学习 - 组件化(三) 合并配置 合并配置 外部调用场景 组件场景 总结 学习内容和文章内容来自 黄轶老师 黄轶老师的慕课网视频教程地址:<Vue.js2.0 源码揭秘>. 黄轶 ...

  6. Vue源码学习 - 组件化一 createComponent

    Vue源码学习 - 组件化一 createComponent 组件化 createComponent 构造子类构造函数 安装组件钩子函数 实例化 VNode 总结 学习内容和文章内容来自 黄轶老师 黄 ...

  7. Vue源码学习之initInjections和initProvide

    Vue源码学习之initInjections和initProvide 在进行源码阅读之前先让我们了解一个概念:provide/inject,这个是Vue在2.2.0版本新增的一个属性,按照Vue官网的 ...

  8. QMUI源码学习第一天

    QMUI源码学习第一天 QMUIBottomSheet QMUIGroupListView QMUIRoundButtton QMUITipDialog QMUIDialog QMUIPopup QM ...

  9. vue实例没有挂载到html上,vue 源码学习 - 实例挂载

    前言 在学习vue源码之前需要先了解源码目录设计(了解各个模块的功能)丶Flow语法. src ├── compiler # 把模板解析成 ast 语法树,ast 语法树优化,代码生成等功能. ├── ...

  10. Vue源码学习(三)——数据双向绑定

    在Vue中我们经常修改数据,然后视图就直接修改了,那么这些究竟是怎么实现的呢? 其实Vue使用了E5的语法Object.defineProperty来实现的数据驱动. 那么Object.defineP ...

最新文章

  1. Flash cs5 初试
  2. 微信小程序 长按属性
  3. 英语作文 计算机新技术对生活的影响,急求一篇电脑对于未来生活影响的英语作文,50分 200词左右...
  4. 【线上直播】Xilinx U30 视频转码 + AI 的应用技术实践
  5. 最大子段和 分治与动态规划
  6. 语言 ota_荣威RX5 PLUS使用最新的家族设计语言,给人更年轻时尚的感觉
  7. Chrome developer tool介绍(javascript调试)
  8. 小鹏汽车第10000辆P7下线
  9. java 分割数据_java 分割csv数据的实例详解
  10. 特性Attibute定义和使用
  11. ubuntu nsight使用
  12. apk一键脱壳工具_海量破解、修改、无广告软件一键获取!一个工具就能轻松搞定!...
  13. Eplan教程——项目检查错误 005013/005014:连接点类型不同
  14. SpringBoot框架下集成萤石云平台开发海康的摄像头
  15. 关于小米 Mi4 手机的评测
  16. VSTO插件供WPS使用
  17. shui jisfnemskddp psijsjfsif
  18. 51单片机与AVR(SPI)单片机驱动DS1302
  19. cae计算机仿真分析技术,仿真分析工作在研发中的定位
  20. 【OpenGL】平面法向量、顶点法向量的计算方法

热门文章

  1. 迪乐尼童鞋防骗子—常见网络骗子骗术防御要点
  2. 逻辑学在计算机科学的应用,逻辑学在计算机科学中的应用
  3. OAuth2:使用JWT和加密签名
  4. 改革IMF首先要增加中国发言权
  5. [踩坑记录]VS2017+大恒MER-131-210U3C相机
  6. 用Python简单代码实现炫酷动态条形图
  7. 隐枚举法求解0-1整数规划
  8. 交换机、路由器和防火墙的原理和区别
  9. 脱壳总结之 - upx,aspack, FSG,PECompact2.X,WinUpack脱壳
  10. 如何解决 Elasticsearch 中未分配的分片