Vue2基础-Vue2中的数据代理(响应式原理)(HTML版)

Vue2基础全套教程合集:点击跳转        Vue2高级全套教程合集:点击跳转


一、回顾JavaScript的defineProperty方法

Object.defineProperty()的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性

Object.defineProperty(object, propName, descriptor)
  1. obj 需要定义属性的当前对象
  2. prop 当前需要定义的属性名
  3. desc 属性描述符

一般通过为对象的属性赋值的情况下,对象的属性可以修改也可以删除,但是通过Object.defineProperty()定义属性,通过描述符的设置可以进行更精准的控制对象属性。

1. defineProperty的基本使用

<script type="text/javascript" >
	let number = 18
	let person = {
		name:'张三',
		sex:'男',
	}

	Object.defineProperty(person,'age',{
		// value:18,
		// enumerable:true, //控制属性是否可以枚举,默认值是false
		// writable:true, //控制属性是否可以被修改,默认值是false
		// configurable:true //控制属性是否可以被删除,默认值是false

		//当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
		get(){
			console.log('有人读取age属性了')
			return number
		},

		//当有人修改person的age属性时,set函数(setter)就会被调用,且会收到修改的具体值
		set(value){
			console.log('有人修改了age属性,且值是',value)
			number = value
		}

	})

	// console.log(Object.keys(person)) // (2) ['name', 'sex']

	console.log(person) // {name: '张三', sex: '男'}
</script>

二、什么是数据代理?

通过一个对象代理对另一个对象中属性的操作(读/写),即可称为是数据代理

<script type="text/javascript">
   let obj = {
        x: 100
    }
    let obj2 = {
        y: 200
    }
	
	// 通过obj2代理obj中属性的操作(读/写)
    Object.defineProperty(obj2, 'x', {
        get() {
            return obj.x
        },
        set(value) {
            obj.x = value
        }
    })
</script>

三、Vue中的数据代理

  1. Vue中的数据代理:
    通过 vm对象 来代理 data对象 中属性的操作(读/写)
  2. Vue中数据代理的好处:
    更加 方便 的操作data中的数据,简化了数据操作时的书写。
  3. 基本原理:
    通过 Object.defineProperty()data对象 中所有属性添加到 vm 上。
    为每一个添加到vm上的属性,都指定一个 getter/setter
    在getter/setter内部去 操作(读/写) data中对应的属性。
  4. 如果Vue没有数据代理会怎么样?
    在使用data中的数据时,需要this._data.xxx进行操作,光是看到就恐怖如斯。

<body>
    <!-- 准备好一个容器-->
    <div id="root">
        <h2>学校名称:{{name}}</h2>
        <h2>学校地址:{{address}}</h2>
    </div>
</body>

<script type="text/javascript">
    Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

    const vm = new Vue({
        el: '#root',
        data: {
            name: '尚硅谷',
            address: '宏福科技园'
        }
    })
</script>

源代码出处:尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值