v-model底层原理
非侵入式
是通过Object.defineProperty(obj,key,{set:,get:}) 是通过里面的get(getter),set(setter)来实现
get中通过dep.depend()来依赖收集,set中通过dep.notify()来触发数组更新
这个函数中含有get和set两个属性,当区访问key(value)时便会去调用get()和set()两个方法,getter和setter需要变量周转才能正常工作
import observe from ‘./observe.js’
function defineReactive(data,key,val){ //利用闭包属性来去操作(val是新值)
let child = observe(obj)
Object.defineproperty(obj,‘a’,{
get(){
console.log(‘a属性’)
return val //变量周转
}
set(newValue){
console.log(‘新a属性’,newValue)
if(val === newValue){return}
val = newValue
child = observe(newValue)
}
export const def = function(obj,key,value,enumerable){
Object.defineProperty(obj,key,{
value,enumerable,writable:true,configurable:true
})
}
import {def}