Object.defineProperty(obj, name, {
// 获取值的时候先置入vm的_data属性对象中
get() {
// 赋值的时候显示的特性
},
set() {
// 值变化的时候可以做点什么
}
})
/**
* @param {Object} _data 用于存放data值
* @param {Object} $data data原始数据对象,当前值
* @param {Object} callback 回调函数
*/
var vm = { _data: {}, $data: {}, callback: {} }
vm.$watch = (obj, func) => {
// 回调函数
vm.callback[ obj ] = func
// 设置data
Object.defineProperty(vm.$data, obj, {
// 获取值的时候先置入vm的_data属性对象中
get() {
return vm._data[ obj ]
},
set(val) {
// 比较原值,不相等则赋值,执行回调
if (val !== vm._data[ obj ]) {
vm._data[ obj ] = val
const cb = vm.callback[ obj ]
cb.call(vm)
}
}
})
}
vm.$watch('va', () => {console.log('已经成功被监听啦')})
vm.$data.va = 1
var defineReactive = (obj, key) => {
Object.defineProperty(obj, key, {
get() {
return vm._data[key]
},
set(newVal) {
if (vm._data[key] === newVal) {
return
}
vm._data[key] = newVal
const cb = vm.callback[ obj ]
cb.call(vm)
}
})
}
var Observer = (obj) => {
// 遍历,让对象中的每个属性可以加上get set
Object.keys(obj).forEach((key) =>{
defineReactive(obj, key)
})
}
// 判断是否为object类型,是就继续执行自身
var observe = (value) => {
// 判断是否为object类型,是就继续执行Observer
if (!value || typeof value !== 'object') {
return
}
return new Observer(value)
}
// 将observe方法置入defineReactive中Object.defineProperty的set中,形成递归
var defineReactive = (obj, key) => {
// 判断val是否为对象,如果对象有很多层属性,则这边的代码会不断调用自身(因为observe又执行了Observer,而Observer执行defineReactive),一直到最后一层,从最后一层开始执行下列代码,层层返回(可以理解为洋葱模型),直到最前面一层,给所有属性加上get/set
var childObj = observe(vm._data[key])
Object.defineProperty(obj, key, {
get() {
return vm._data[key]
},
set(newVal) {
// 如果设置的值完全相等则什么也不做
if (vm._data[key] === newVal) {
return
}
// 不相等则赋值
vm._data[key] = newVal
// 执行回调
const cb = vm.callback[ key ]
cb.call(vm)
// 如果set进来的值为复杂类型,再递归它,加上set/get
childObj = observe(val)
}
})
}
var vm = { _data: {}, $data: {}, callback: {}}
var defineReactive = (obj, key) => {
// 一开始的时候是不设值的,所以,要在外面做一套observe
// 判断val是否为对象,如果对象有很多层属性,则这边的代码会不断调用自身(因为observe又执行了Observer,而Observer执行defineReactive),一直到最后一层,从最后一层开始执行下列代码,层层返回(可以理解为洋葱模型),直到最前面一层,给所有属性加上get/set
var childObj = observe(vm._data[key])
Object.defineProperty(obj, key, {
get() {
return vm._data[key]
},
set(newVal) {
if (vm._data[key] === newVal) {
return
}
// 如果值有变化的话,做一些操作
vm._data[key] = newVal
// 执行回调
const cb = vm.callback[ key ]
cb.call(vm)
// 如果set进来的值为复杂类型,再递归它,加上set/get
childObj = observe(newVal)
}
})
}
var Observer = (obj) => {
Object.keys(obj).forEach((key) =>{
defineReactive(obj, key)
})
}
var observe = (value) => {
// 判断是否为object类型,是就继续执行Observer
if (!value || typeof value !== 'object') {
return
}
Observer(value)
}
vm.$watch = (name, func) => {
// 回调函数
vm.callback[name] = func
// 设置data
defineReactive(vm.$data, name)
}
// 绑定a,a若变化则执行回调方法
var va = {a:{c: 'c'}, b:{c: 'c'}}
vm._data[va] = {a:{c: 'c'}, b:{c: 'c'}}
vm.$watch('va', () => {console.log('已经成功被监听啦')})
vm.$data.va = 1
var vm = { _data: {}, $data: {}, callback: {}}
var defineReactive = (obj, key, cb) => {
// 一开始的时候是不设值的,所以,要在外面做一套observe
var childObj = observe(vm._data[key], cb)
Object.defineProperty(obj, key, {
get() {
return vm._data[key]
},
set(newVal) {
if (vm._data[key] === newVal) {
return
}
// 如果值有变化的话,做一些操作
vm._data[key] = newVal
// 执行回调
cb()
// 如果set进来的值为复杂类型,再递归它,加上set/get
childObj = observe(newVal)
}
})
}
var Observer = (obj, cb) => {
Object.keys(obj).forEach((key) =>{
defineReactive(obj, key, cb)
})
}
var observe = (value, cb) => {
// 判断是否为object类型,是就继续执行Observer
if (!value || typeof value !== 'object') {
return
}
Observer(value, cb)
}
vm.$watch = (name, func) => {
// 回调函数
vm.callback[name] = func
// 设置data
defineReactive(vm.$data, name, func)
}
// 绑定a,a若变化则执行回调方法
var va = {a:{c: 'c'}, b:{c: 'c'}}
vm._data.va = {a:{c: 'c'}, b:{c: 'c'}}
vm.$watch('va', () => {console.log('又成功被监听啦')})
vm.$data.va.a = 1
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有