在回答這個問題之前,需要了解$(...)返回一個具有類數組屬性的特殊對象。從文檔:
jQuery的工廠函數$()返回一個具有許多陣列的 的特性(長度時,[]數組訪問運算符, 等)jQuery對象,但不完全是與數組相同,並且缺少一些 數組的內置方法(如.pop()和.reverse())。
所以,這就是發生了什麼。不管選擇器的類型的
,new jQuery.fn.init(selector, context, rootjQuery);
被調用,因此一個新的對象被創建,其性能列於這個init()
構造方法設置。
參數$(...)通過檢查空白,DOMElement,字符串或函數(通過isFunction)
所有檢查失敗,最後調用下面的代碼。
if (selector.selector !== undefined) {
this.selector = selector.selector;
this.context = selector.context;
}
return jQuery.makeArray(selector, this);
功能makeArray(),而它仍然基於jQuery原型對象輪流提供選擇成陣列狀物體,通過簡單地設置this.length
屬性和this.ret[0]=..., this.ret[1]=...
使得它「感覺」像陣列(又名$.fn
) 。請記住,上面的代碼中的this
僅僅是原型中帶有$.fn
的全新對象。 此外,.selector
和.context
屬性從原始複製到此。
重要的是要注意,例如, .prevObject
屬性將丟失,但可能會添加新的屬性,具體取決於方法鏈接。
總而言之,這需要時間和內存,當有人可能將jQuery對象傳遞到您的插件時,只需檢查.selector
就可以了。另一方面,具有與原創相同行爲的新實例可能會有所幫助。
沒有魔法...這是由設計。你有很多方法來指定一個選擇器。字符串和DOM對象都很好。 – Brad
發生這種情況:http://jsapi.info/jquery/1.8.0/jQuery.fn.init :) – Andreas
@Brad我知道,並利用目前的功能。我只想知道發生了什麼。 – Fresheyeball