注意: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