注意: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
jQuery对象是一个类数组对象,注意:类数组对象并不是数组!
至于栈结构:则是先进后出,FILO( first in last out ),类似于一个没有盖的木桶,第一次放进去的水(假设不考虑水分子的运动)在最下面,第二次放进去的水在第一次放进去的水的上面....取水时,先取最后一次放进去的水,第一次放进去的水反而最后取出来。
至于栈结构:则是先进后出,FILO( first in last out ),类似于一个没有盖的木桶,第一次放进去的水(假设不考虑水分子的运动)在最下面,第二次放进去的水在第一次放进去的水的上面....取水时,先取最后一次放进去的水,第一次放进去的水反而最后取出来。
2016-11-09
1 插件分两种,一种是静态函数: 不用实例化就可以直接调用,比如:Math.floor();另一种是实例方法:只有实例才能使用,比如: var a = 'hah' ; a.length
2 jQuery.extend() 和 jQuery.fn.extend() 指向的都是同一个函数,之所以能实现不同的功能,就死因为函数内部通过对 this 进行判断进而实现了重载。
3 详细的关于extend()函数的讲解,在我的博客:http://www.cnblogs.com/MnCu8261/p/6039986.html
2 jQuery.extend() 和 jQuery.fn.extend() 指向的都是同一个函数,之所以能实现不同的功能,就死因为函数内部通过对 this 进行判断进而实现了重载。
3 详细的关于extend()函数的讲解,在我的博客:http://www.cnblogs.com/MnCu8261/p/6039986.html
2016-11-09
所以我们如果需要链式的处理,只需要在方法内部方法当前的这个实例对象this就可以了。 课程中的这句话有歧义: 1 像css() hide() addClass() show()等这些方法,直接返回this是没有问题的。
2 而next() childern() parent() 等这些方法,则需要对this进行处理,然后将处理之后的结果进行返回。
不过,总之,链式处理的前提必须是方法中必须返回一个或者一些实例对象
2 而next() childern() parent() 等这些方法,则需要对this进行处理,然后将处理之后的结果进行返回。
不过,总之,链式处理的前提必须是方法中必须返回一个或者一些实例对象
2016-11-09
我觉得叫苦是没用的,本课程的讲解是有前提的----必需熟练掌握javascript基础知识!不掌握这些知识肯定看不懂,其次,我们还要对面向对象,插件编写等有一定的了解,否则我们只能读懂代码,但不清楚:为啥要这样做?如果用那样的方式不是会更简单吗?这么绕来绕去有啥用? 再就是,即使我们能做到以上两点,我们就能游刃有余的学习这门课程了么?我只能说:骚年,图样图私募跑! 我们需要反复阅读本课程,很多东西需要我们反复思考才能理解,才能查漏补缺。
2016-11-09
js中的面向对象这一块不熟悉的,可以看我的博客:http://www.cnblogs.com/MnCu8261/p/5965397.html
2016-11-09
在javascript的世界中一共有四种上下文调用方式:方法调用模式、函数调用模式、构造器调用模式、apply调用模式。我要分别解释一下:
方法调用模式: 类似于foo.bar(),函数作为一个对象的方法出现,this指向foo。
函数调用模式:类似于bar(),函数单独出现,this指向window
构造器调用模式:类似于 var foo = new bar(),this指向new bar()返回的对象。
apply调用:类似于bar.apply(object),this指向object
方法调用模式: 类似于foo.bar(),函数作为一个对象的方法出现,this指向foo。
函数调用模式:类似于bar(),函数单独出现,this指向window
构造器调用模式:类似于 var foo = new bar(),this指向new bar()返回的对象。
apply调用:类似于bar.apply(object),this指向object
2016-11-07