关于观察者模式和apply 还有 call 的深入研究

来源:互联网 发布:ip2780清零软件 编辑:程序博客网 时间:2024/06/05 13:22

首先应该是这个Call 和 apply


看了很多网上的解释都是什么改变作用域 
call(obj,[[args1],args2])apply 只不过
传递的参数不一样而已啦,剩下都是一个逻辑,更改this指针的指向,所以就有人用来做继承,也就是在子类进行继承的时候要更改一下this指向,将函数或者


属性进行一些早期绑定。

不知道是我脑子不好使还是网上写的不够全面,fn.someFunction.apply(someObj,argumentsArray) 这里大家没有发现一个问题,如果我们用的是

数组的一些方法,但是传递进去是一个Object的话 就会报错啊,所以这两个东西更改指向倒是没有什么事情,但是呢,更改的对象和你要应用某个对象的方法是同一个对象类型

说起来很绕啊

Array.prototype.shift.apply(Object)typeof Object  === typeof Array;//上面的这个判定很显然不成立吧,所以一个Object是不能用array的方法的! 

OK  这个问题觉得应该说完了,具体别人写的很多啦


来吧 观察者模式,什么是观察者模式呢,就是订阅方法并且储存,然后统一通知调用

上个代码吧

var CustomEvent = function(){var Event = {Queen:{},listen:function(type,fn){if(typeof this.Queen[type] === "undefined"){this.Queen[type] = []; }this.Queen[type].push(fn);return this;},trigger:function(){//arguments is a likeArray Objectvar key = [].shift.apply(arguments),fns = this.Queen[key];if(!fns || fns.length === 0){return false;}for(var i = 0;i < fns.length;i++){fns[i].apply(this,arguments);}return this;},remove:function(type,fn){fns = this.Queen[type];if(!fns){return false;}if(!fn){fns.length = 0;}for(var i = fns.length -1,_fn = fns[l];i >= 0;i--){if(_fn === fn){fns.splice(l,1);}}return this;},};return Event;}

这个就是实现观察者模式的一段代码,具体就是接受一堆key -> value 对 然后装在队列里面

0 0