明波

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

vue数据绑定原理

Object.defineProperty 数据劫持,给每个属性设置了get、set。
 
class myvue {
    constructor(options){
        this.$options = options;

        // 数据响应化
        this.$data = options.data;
        this.observe(this.$data);
    }

    observe(value) {
        if(!value || typeof value !== 'object'){
            return;
        }

        // 遍历该对象
        Object.keys(value).forEach(key => {
            this.defineReactive(value, key, value[key])
        })
    }

    defineReactive(obj, key, val) {

        this.observe(val); // 递归解决数据嵌套

        Object.defineProperty(obj, key, {
            get(){
                return val;
            },
            set(newVal) {
                if(newVal === val) {
                    return;
                }
                val = newVal;
                console.log(`${key}属性更新了:${val}`);
            }
        })
    }
}
posted on 2019-12-27 01:39  明波  阅读(143)  评论(0)    收藏  举报