Vue3.x核心是Proxy。两者从代码层面相比,Proxy要更加简洁,原因是Proxy是直接监听对象,而defineProperty是监听每个对象里的属性。Proxy是ES6新增的,IE浏览器不支持
<!-- Vue3.x 数据响应式原理 --><!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>数据响应式</title></head><body><div id="app">Hello Vue</div><!--Vue 3.x 数据响应式原理 Proxy 代理--><script>// 模拟Vue实例 data 数据let data = {msg: '响应式数据',count: 0}// 模拟Vue实例let vm = new Proxy(data, {//执行代理行为的函数//当访问vm的成员会执行//target其实就是我们的代理对象dataget(target,key){console.log('getter:',key ,'-----',target[key])return target[key]},set(target,key,newValue) {console.log('setter:',key ,'-----',target[key])if(target[key] === newValue){return;}target[key] = newValuedocument.querySelector('#app').textContent = target[key]}})vm.msg = 'Hello响应式'console.log(vm.msg);</script></body></html>
Proxy实现数据响应式原理要比defineProperty简便,而且Proxy是直接面向整个对象的属性,而defineProperty对一个对象的多个属性都实现数据响应式,则要循环使用Object.defineProperty
