Vue源码解析,用this可以访问data属性的原因

本文深入探讨Vue源码,揭示在Vue实例中如何通过`this`直接访问data属性的原理。核心在于Vue将data对象的属性代理到了实例上,实现这一功能的关键代码位于初始化阶段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

new Vue({
	el: '#app',
	data: {
		message: 'this is message';
	}
})

在编写代码中可以通过this.message访问到message的值,这不是魔法,直接上源码。
state.jsinitData中,有如下代码

function initData(vm: Component) {
	let data = vm.$options.data
	data = vm._data = typeof data === 'function'
		? getData(data, vm)
		: data || {}
		
	/**** 此处省略若干行 ****/
	
	// 通过proxy把data里的值代理到vm对象上
	proxy(vm, `_data`, key)
}

// proxy函数相关的代码
// 定义访问器属性
const sharedPropertyDefinition = {
  enumerable: true,
  configurable: true,
  get: noop,
  set: noop
}

function proxy (target: Object, sourceKey: string, key: string) {
	sharedPropertyDefinition.get = function proxyGetter() {
		return this[sourceKey][key]; // 即访问 this['_data'][key]
	}
	sharedPropertyDefinition.set = function proxySetter(val) {
		this[sourceKey][key] = val;
	}	
	Object.defineProperty(target, key, sharedPropertyDefinition)
}

通过Object.defineProperty把data上的属性代理到vm上,vmthis对象
这就是可以通过this.message访问data属性的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值