将观察者都搞在一个集合中,当被观察者发生变化,就直接找到这个集合,并运行其中的函数。
再扩展一下:
可能有很多被观察者,每个被观察者都对应一个观察者集合,所以我们需要一个‘池’ 来存储这些集合。那么 键值对 的格式就很符合。 { 被观察者1:[观察者集合] , 被观察者2:[观察者集合]....}
再扩展一下:
可能有很多被观察者,每个被观察者都对应一个观察者集合,所以我们需要一个‘池’ 来存储这些集合。那么 键值对 的格式就很符合。 { 被观察者1:[观察者集合] , 被观察者2:[观察者集合]....}
2016-11-19
最新回答 / 菜狗
那里面的self本身不是window,你调试的时候显示window是因为chrome自己本身把window存在了一个叫self的变量上,原来的里面的self值已经return给外面的cbs了。。。= =不执行示例代码直接打印self也是window
2016-11-17
注意:javascript中的Array对象的indexOf()方法,如果要检索的字符串值没有出现,则该方法返回 -1, 返回-1,返回-1 !!!
2016-11-11
定义一个函数(对象),该函数的每一个实例内部存在一个数组,这个数组包含了所有观察者。实例中的add remove fire等方法都是对这个数组进行操作。
2016-11-10
‘通过回调函数callback返回的ture/false的布尔值结果就可以来判断当前是否要强制退出循环’,这样做的好处:
提高性能
为什么呢?
比如我们要把包含5个<li>的jQuery对象中的前三个li元素隐藏。
两种方法:
1 $fiveLi.each(function(index,ele){if(index <3){$(ele).hide()}});//这样会循环5次
2 $fiveLi.each(function(index,ele){if(index >= 3){return false} $(ele).hide()}) // 这样只会循环3次
提高性能
为什么呢?
比如我们要把包含5个<li>的jQuery对象中的前三个li元素隐藏。
两种方法:
1 $fiveLi.each(function(index,ele){if(index <3){$(ele).hide()}});//这样会循环5次
2 $fiveLi.each(function(index,ele){if(index >= 3){return false} $(ele).hide()}) // 这样只会循环3次
回顾:pushStack做了四件事
1 新建一个空的jQuery对象
2 新建的空对象将参数(实际上也是一个对象)包含合并
3 将合并后的jQuery对象的pervObject指向this
4 返回合并后的对象
再来分析一下eq()的源码:
eq()首先解析传入的参数,该不动的不动,该转换的转换;然后调用pushStack()函数,并将对应的DOM对象作为参数传入,然后将pushStack()函数返回的jQuery对象返回。
注意: 返回的jQuery对象的prevObject已经指向了调用eq()方法的对象。比如: aObj.eq(0).prevObject-->aObj
1 新建一个空的jQuery对象
2 新建的空对象将参数(实际上也是一个对象)包含合并
3 将合并后的jQuery对象的pervObject指向this
4 返回合并后的对象
再来分析一下eq()的源码:
eq()首先解析传入的参数,该不动的不动,该转换的转换;然后调用pushStack()函数,并将对应的DOM对象作为参数传入,然后将pushStack()函数返回的jQuery对象返回。
注意: 返回的jQuery对象的prevObject已经指向了调用eq()方法的对象。比如: aObj.eq(0).prevObject-->aObj
2016-11-09
pushStack: function( elems ) {
// Build a new jQuery matched element set
var ret = jQuery.merge( this.constructor(), elems );
// Add the old object onto the stack (as a reference)
ret.prevObject = this;
ret.context = this.context;
// Return new jQueryObject
return ret;
}
// Build a new jQuery matched element set
var ret = jQuery.merge( this.constructor(), elems );
// Add the old object onto the stack (as a reference)
ret.prevObject = this;
ret.context = this.context;
// Return new jQueryObject
return ret;
}
2016-11-09
解释一下这句话(流程解析中的1): ‘因为constructor是指向构造器的,所以这里就等同于调用jQuery()方法了’
我们知道:
1 jQuery = function(){ return new jQuery.fn.init(); }
2 jQuery.fn = jQuery.prototype = { init:function(){//.....} , constructor:jQuery }
所以 this.constructor() == jQuery()
我们知道:
1 jQuery = function(){ return new jQuery.fn.init(); }
2 jQuery.fn = jQuery.prototype = { init:function(){//.....} , constructor:jQuery }
所以 this.constructor() == jQuery()
2016-11-09