这篇文章主要介绍了详解Vue源码之数据的代理访问,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

概念解析:

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 对象。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持爱安网。

最新资讯
LED专利战

LED专利战

在市场加速集中的过程中,研发能力逐渐成为头部公司提升
社交+带货 美版“闲鱼”Poshmark大热上市

社交+带货 美版“闲鱼

1月15日,素有美国版“闲鱼”之称的Poshmark Inc。在美
LED行业专利时代:何以为矛何以为盾?

LED行业专利时代:何以

知识产权是人们就其智力劳动成果所依法享有的专有权利
传苹果下半年或明年初推出新款MacBook Air 更轻薄且配备MagSafe

传苹果下半年或明年初

苹果公司计划将该设备作为当前MacBook Air的高端版本
悦刻电子烟登陆纽交所:开盘价24美元 较发行价上涨100%

悦刻电子烟登陆纽交所

电子烟企业雾芯科技(悦刻)今日正式登陆纽交所,股票代码为
雾芯科技美国上市:市值超百亿美元 红杉为股东

雾芯科技美国上市:市值

电子雾化龙头企业雾芯科技(股票代码为:“RLX”)今日在纽
最新文章
详解Vue的ref特性的使用

详解Vue的ref特性的使

这篇文章主要介绍了详解Vue的ref特性的使用,文中通过
vue学习笔记之slot插槽基本用法实例分析

vue学习笔记之slot插

这篇文章主要介绍了vue学习笔记之slot插槽基本用法,结
vue跳转方式(打开新页面)及传参操作示例

vue跳转方式(打开新页

这篇文章主要介绍了vue跳转方式(打开新页面)及传参操作,
vue学习笔记之过滤器的基本使用方法实例分析

vue学习笔记之过滤器

这篇文章主要介绍了vue学习笔记之过滤器的基本使用方
js获取本日、本周、本月的时间代码

js获取本日、本周、本

本篇文章给大家分享的内容是利用js如何获取本日、本周
node crawler如何添加promise支持

node crawler如何添加

这篇文章主要介绍了node crawler如何添加promise支持,