vue源码学习(第一张) this访问data数据 拆散之后并不难
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()
函数做了什么。
他的get
和set
方法实际上是改变了this访问时的指向,如果你知道Object.defineProperty
这个api
到这里其实你已经明白他的原理了,他就是给每个变量做了代理。
vue源码学习(第一张) this访问data数据 拆散之后并不难相关推荐
- VUE源码学习第一篇--前言
一.目的 前端技术的发展,现在以vue,react,angular为代表的MVVM模式以成为主流,这三个框架大有三分天下之势.react和angular有facebook与谷歌背书,而vue是以一己之 ...
- vue源码学习--vue源码学习入门
本文为开始学习vue源码的思路整理.在拿到vue项目源码的之后看到那些项目中的文件夹,会很困惑,不知道每个文件夹内的世界,怎么变换,怎样的魔力,最后产生了vue框架.学习源码也无从学起.我解决了这些困 ...
- Vue源码学习之Computed与Watcher原理
前言 computed与watch是我们在vue中常用的操作,computed是一个惰性求值观察者,具有缓存性,只有当依赖发生变化,第一次访问computed属性,才会计算新的值.而watch则是当 ...
- Vue源码学习 - 准备工作
Vue源码学习 - 准备工作 准备工作 认识Flow 为什么用 Flow Flow 的工作方式 类型推断 类型注释 数组 类和对象 null Flow 在 Vue.js 源码中的应用 flow实践 总 ...
- Vue源码学习 - 组件化(三) 合并配置
Vue源码学习 - 组件化(三) 合并配置 合并配置 外部调用场景 组件场景 总结 学习内容和文章内容来自 黄轶老师 黄轶老师的慕课网视频教程地址:<Vue.js2.0 源码揭秘>. 黄轶 ...
- Vue源码学习 - 组件化一 createComponent
Vue源码学习 - 组件化一 createComponent 组件化 createComponent 构造子类构造函数 安装组件钩子函数 实例化 VNode 总结 学习内容和文章内容来自 黄轶老师 黄 ...
- Vue源码学习之initInjections和initProvide
Vue源码学习之initInjections和initProvide 在进行源码阅读之前先让我们了解一个概念:provide/inject,这个是Vue在2.2.0版本新增的一个属性,按照Vue官网的 ...
- QMUI源码学习第一天
QMUI源码学习第一天 QMUIBottomSheet QMUIGroupListView QMUIRoundButtton QMUITipDialog QMUIDialog QMUIPopup QM ...
- vue实例没有挂载到html上,vue 源码学习 - 实例挂载
前言 在学习vue源码之前需要先了解源码目录设计(了解各个模块的功能)丶Flow语法. src ├── compiler # 把模板解析成 ast 语法树,ast 语法树优化,代码生成等功能. ├── ...
- Vue源码学习(三)——数据双向绑定
在Vue中我们经常修改数据,然后视图就直接修改了,那么这些究竟是怎么实现的呢? 其实Vue使用了E5的语法Object.defineProperty来实现的数据驱动. 那么Object.defineP ...
最新文章
- Flash cs5 初试
- 微信小程序 长按属性
- 英语作文 计算机新技术对生活的影响,急求一篇电脑对于未来生活影响的英语作文,50分 200词左右...
- 【线上直播】Xilinx U30 视频转码 + AI 的应用技术实践
- 最大子段和 分治与动态规划
- 语言 ota_荣威RX5 PLUS使用最新的家族设计语言,给人更年轻时尚的感觉
- Chrome developer tool介绍(javascript调试)
- 小鹏汽车第10000辆P7下线
- java 分割数据_java 分割csv数据的实例详解
- 特性Attibute定义和使用
- ubuntu nsight使用
- apk一键脱壳工具_海量破解、修改、无广告软件一键获取!一个工具就能轻松搞定!...
- Eplan教程——项目检查错误 005013/005014:连接点类型不同
- SpringBoot框架下集成萤石云平台开发海康的摄像头
- 关于小米 Mi4 手机的评测
- VSTO插件供WPS使用
- shui jisfnemskddp psijsjfsif
- 51单片机与AVR(SPI)单片机驱动DS1302
- cae计算机仿真分析技术,仿真分析工作在研发中的定位
- 【OpenGL】平面法向量、顶点法向量的计算方法