有沒有快速檢查對象是jQuery對象仍是本機JavaScript對象的方法? javascript
例: java
var o = {}; var e = $('#element'); function doStuff(o) { if (o.selector) { console.log('object is jQuery'); } } doStuff(o); doStuff(e);
顯然,上面的代碼有效,但不安全。 您能夠將選擇鍵添加到o
對象並得到相同的結果。 有沒有更好的方法來確保對象其實是一個jQuery對象? jquery
符合的東西(typeof obj == 'jquery')
express
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);
您可使用instanceof
運算符: 安全
obj instanceof jQuery
說明 : jQuery
函數(又名$
)是做爲構造函數實現的 。 使用new
前綴調用構造函數。 閉包
當你調用$(foo)
,內部jQuery會將其轉換爲new jQuery(foo)
1 。 JavaScript繼續在構造函數內初始化this
以指向jQuery
的新實例,將其屬性設置爲jQuery.prototype
(aka jQuery.fn
)上的屬性。 所以,您將得到一個new
對象,其中instanceof jQuery
爲true
。 ide
1 它其實是new jQuery.prototype.init(foo)
:構造函數邏輯已被卸載到另外一個名爲init
構造函數,但概念是相同的。 函數
查看instanceof運算符。 this
var isJqueryObject = obj instanceof jQuery
檢查對象實例的最佳方法是經過instanceof運算符或方法isPrototypeOf()來檢查對象的原型是否在另外一個對象的原型鏈中。 spa
obj instanceof jQuery; jQuery.prototype.isPrototypeOf(obj);
但有時在文檔上有多個jQuery實例的狀況下可能會失敗。 正如@Georgiy Ivankin所說:
若是我當前的命名空間中的
$
指向jQuery2
而且我有一個來自外部命名空間的對象(其中$
是jQuery1
)那麼我沒法使用instanceof
來檢查該對象是不是一個jQuery
對象
解決該問題的一種方法是在閉包或IIFE中對jQuery對象進行別名處理
//aliases jQuery as $ (function($, undefined) { /*... your code */ console.log(obj instanceof $); console.log($.prototype.isPrototypeOf(obj)); /*... your code */ }(jQuery1)); //imports jQuery1
克服該問題的其餘方法是經過查詢obj
的jquery
屬性
'jquery' in obj
可是,若是您嘗試使用原始值執行該檢查,則會拋出錯誤,所以您能夠經過確保obj
成爲Object
來修改先前的檢查
'jquery' in Object(obj)
雖然前面的方法不是最安全的(您能夠在對象中建立'jquery'
屬性),但咱們能夠經過使用這兩種方法來改進驗證:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
這裏的問題是任何對象均可以將屬性jquery
定義爲本身的,所以更好的方法是在原型中詢問,並確保該對象不爲null
或undefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
因爲強制 ,當obj
是任何僞值( null
, undefined
, false
, 0
, ""
)時, if
語句將經過評估&&
運算符來進行短路,而後繼續執行其餘驗證。
最後咱們能夠編寫一個實用函數:
function isjQuery(obj) { return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)); }
讓咱們來看看: 邏輯運算符和truthy / falsy
var elArray = []; var elObjeto = {}; elArray.constructor == Array //TRUE elArray.constructor == Object//TALSE elObjeto.constructor == Array//FALSE elObjeto.constructor == Object//TRUE