檢查object是不是jQuery對象

有沒有快速檢查對象是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


#1樓

return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);

#2樓

您可使用instanceof運算符: 安全

obj instanceof jQuery

說明jQuery函數(又名$ )是做爲構造函數實現的 。 使用new前綴調用構造函數。 閉包

當你調用$(foo) ,內部jQuery會將其轉換爲new jQuery(foo) 1 。 JavaScript繼續在構造函數內初始化this以指向jQuery的新實例,將其屬性設置爲jQuery.prototype (aka jQuery.fn )上的屬性。 所以,您將得到一個new對象,其中instanceof jQuerytrueide


1 它其實是new jQuery.prototype.init(foo) :構造函數邏輯已被卸載到另外一個名爲init構造函數,但概念是相同的。 函數


#3樓

查看instanceof運算符。 this

var isJqueryObject = obj instanceof jQuery

#4樓

檢查對象實例的最佳方法是經過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

克服該問題的其餘方法是經過查詢objjquery屬性

'jquery' in obj

可是,若是您嘗試使用原始值執行該檢查,則會拋出錯誤,所以您能夠經過確保obj成爲Object來修改先前的檢查

'jquery' in Object(obj)

雖然前面的方法不是最安全的(您能夠在對象中建立'jquery'屬性),但咱們能夠經過使用這兩種方法來改進驗證:

if (obj instanceof jQuery || 'jquery' in Object(obj)) { }

這裏的問題是任何對象均可以將屬性jquery定義爲本身的,所以更好的方法是在原型中詢問,並確保該對象不爲nullundefined

if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }

因爲強制 ,當obj是任何值( nullundefinedfalse0"" )時, if語句將經過評估&&運算符來進行短路,而後繼續執行其餘驗證。

最後咱們能夠編寫一個實用函數:

function isjQuery(obj) {
  return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}

讓咱們來看看: 邏輯運算符和truthy / falsy


#5樓

var elArray = [];
var elObjeto = {};

elArray.constructor == Array //TRUE
elArray.constructor == Object//TALSE

elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE
相關文章
相關標籤/搜索