博客
关于我
vue简版源码 Observer
阅读量:330 次
发布时间:2019-03-04

本文共 2317 字,大约阅读时间需要 7 分钟。

vue简版源码 Observer

  // observer 观察者

Observer

function Observer(data) {       //在Observer实例上暂存data    this.data = data;    this.walk(data);}Observer.prototype = {       walk: function(data) {           var me = this;        //对data里所有的属性名进行遍历        Object.keys(data).forEach(function(key) {               me.convert(key, data[key]);        });    },    convert: function(key, val) {           //为每个属性增加响应式        this.defineReactive(this.data, key, val);    },    defineReactive: function(data, key, val) {           //为data中所有层次的属性都创建一个dep实例        var dep = new Dep();        //递归遍历data中所有层次的属性        var childObj = observe(val);        //为原有属性新增get和set方法(数据劫持)        Object.defineProperty(data, key, {               enumerable: true, // 可枚举            configurable: false, // 不能再define            get: function() {                   //判断当前Dep.target的watcher是否存在                if (Dep.target) {   //当模版初始化的时候会赋值watcher实例到target上                    //调用dep的depend方法                    dep.depend();                }                return val;            },            set: function(newVal) {                   if (newVal === val) {                       return;                }                val = newVal;                // 新的值是object的话,进行监听                childObj = observe(newVal);                // 通知订阅者                dep.notify();            }        });    }};function observe(value, vm) {       //判断value是否存在或者value的数据类型是否为object(递归的终止条件)    if (!value || typeof value !== 'object') {           return;    }    return new Observer(value);};var uid = 0;function Dep() {       //没创建一个dep都会给这个dep增加一个独立的标识    this.id = uid++;    this.subs = []; //watcher}Dep.prototype = {       addSub: function(sub) {           this.subs.push(sub);    },    //调用watcher实例的addDep方法    depend: function() {           //Dep.target此时是watcher的实例        //this此时是当前dep的实例        Dep.target.addDep(this);    },    removeSub: function(sub) {           var index = this.subs.indexOf(sub);        if (index != -1) {               this.subs.splice(index, 1);        }    },    //通知所有的watcher    notify: function() {           // beforeUpdate        //遍历subs中所有的watcher的实例        this.subs.forEach(function(sub) {               // 每一个watcher的实例调用update方法            sub.update();        });        // updated    }};Dep.target = null;

转载地址:http://vnke.baihongyu.com/

你可能感兴趣的文章
SLAM学习笔记-求解视觉SLAM问题
查看>>
普歌-允异团队-HashMap面试题
查看>>
还在一个一个手动安装虚拟机吗?Cobbler自动部署装机一键最小化安装打把游戏就好了
查看>>
程序员应该知道的97件事
查看>>
create-react-app路由的实现原理
查看>>
Linux环境变量配置错误导致命令不能使用(杂谈)
查看>>
openstack安装(九)网络服务的安装--控制节点
查看>>
shell编程(六)语言编码规范之(变量)
查看>>
vimscript学习笔记(二)预备知识
查看>>
SSM项目中遇到Could not autowire. No beans of ‘XXX‘ type found.错误
查看>>
Android数据库
查看>>
HTML基础,块级元素/行内元素/行内块元素辨析【2分钟掌握】
查看>>
keil左侧文件调整方法
查看>>
STM8 GPIO模式
查看>>
omnet++
查看>>
23种设计模式一:单例模式
查看>>
Qt中的析构函数
查看>>
C语言实现dijkstra(adjacence matrix)
查看>>
C语言学习从初级到精通的疯狂实战教程-徐新帅-专题视频课程
查看>>
三层框架+sql server数据库 实战教学-徐新帅-专题视频课程
查看>>