详解vue原理

1 首先要熟知观察者模式,直接放一个例子,放进js中观察,例子来源
https://www.cnblogs.com/imwtr/p/9451129.html#o5

			// 观察者
			var observer = {
			    // 订阅集合
			    subscribes: [],
			
			    // 订阅
			    subscribe: function(type, fn) {
			        if (!this.subscribes[type]) {
			            this.subscribes[type] = [];
			        }
			        
			        // 收集订阅者的处理
			        typeof fn === 'function' && this.subscribes[type].push(fn);
			    },
			
			    // 发布  可能会携带一些信息发布出去
			    publish: function() {
			        var type = [].shift.call(arguments),
			            fns = this.subscribes[type];
						
						console.log(fns);
			        // 不存在的订阅类型,以及订阅时未传入处理回调的
			        if (!fns || !fns.length) {
			            return;
			        }
			        
			        // 挨个处理调用
			        for (var i = 0; i < fns.length; ++i) {
			            fns[i].apply(this, arguments);
			        }
			    },
			    
			    // 删除订阅
			    remove: function(type, fn) {
			        // 删除全部
			        if (typeof type === 'undefined') {
			            this.subscribes = [];
			            return;
			        }
			
			        var fns = this.subscribes[type];
			
			        // 不存在的订阅类型,以及订阅时未传入处理回调的
			        if (!fns || !fns.length) {
			            return;
			        }
			
			        if (typeof fn === 'undefined') {
			            fns.length = 0;
			            return;
			        }
			
			        // 挨个处理删除
			        for (var i = 0; i < fns.length; ++i) {
			            if (fns[i] === fn) {
			                fns.splice(i, 1);
			            }
			        }
			    }
			};
			
			// 订阅岗位列表
			function jobListForA(jobs) {
			    console.log('A', jobs);
			}
			
			function jobListForB(jobs) {
			    console.log('B', jobs);
			}
			
			// A订阅了笔试成绩
			observer.subscribe('job', jobListForA);
			// B订阅了笔试成绩
			observer.subscribe('job', jobListForB);
			
			
			// A订阅了笔试成绩
			observer.subscribe('examinationA', function(score) {
			    console.log(score);
			});
			
			// B订阅了笔试成绩
			observer.subscribe('examinationB', function(score) {
			    console.log(score);
			});
			
			// A订阅了面试结果
			observer.subscribe('interviewA', function(result) {
			    console.log(result);
			});
			
			observer.publish('examinationA', 100); // 100
			observer.publish('examinationB', 80); // 80
			observer.publish('interviewA', '备用'); // 备用
			
			observer.publish('job', ['前端', '后端', '测试']); // 输出A和B的岗位,这里是重点,发布1次同时调用2个方法
			
			
			// B取消订阅了笔试成绩
			observer.remove('examinationB');
			// A都取消订阅了岗位
			observer.remove('job', jobListForA);
			
			observer.publish('examinationB', 80); // 没有可匹配的订阅,无输出
			observer.publish('job', ['前端', '后端', '测试']); // 输出B的岗位

2 object.defineProperty

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值