オブジェクトがjQueryオブジェクトかどうかを確認する


602

オブジェクトがjQueryオブジェクトかネイティブJavaScriptオブジェクトかをすばやく確認する方法はありますか?

例:

var o = {};
var e = $('#element');

function doStuff(o) {
    if (o.selector) {
        console.log('object is jQuery');
    }
}

doStuff(o);
doStuff(e);

明らかに、上記のコードは機能しますが、安全ではありません。oオブジェクトにセレクターキーを追加すると、同じ結果が得られる可能性があります。オブジェクトが実際にjQueryオブジェクトであることを確認するより良い方法はありますか?

に沿った何か (typeof obj == 'jquery')


3
jQuery 3.0以降、このselectorプロパティはjQueryオブジェクトであるかどうかを確認するための正しい方法ではありません。プロパティはずっと前に非推奨になり、3.0で削除されたためです。以前のバージョンでも、jQueryオブジェクトは空のセレクター文字列を持つことができます(例えば$(window)、セレクターがない)。instanceof代わりに使用してください。
Dave Methvin、2016

回答:


878

instanceof演算子を使用できます。

if (obj instanceof jQuery){
    console.log('object is jQuery');
}

説明jQuery関数(別名$)は、コンストラクター関数として実装されます。コンストラクター関数は、newプレフィックスを付けて呼び出されます。

を呼び出すと$(foo)、内部的にjQueryがこれをnew jQuery(foo)1に変換します。JavaScriptはthis、コンストラクター関数の内部で初期化を続け、の新しいインスタンスをポイントし、jQueryそのプロパティをjQuery.prototype(別名jQuery.fn)にあるものに設定します。したがって、あなたはnewオブジェクトを取得しますinstanceof jQueryですtrue


1 実際のところnew jQuery.prototype.init(foo)、コンストラクタロジックはと呼ばれる別のコンストラクタ関数にオフロードされていますinitが、概念は同じです。


8
つまり、どういう意味if (obj instanceof jQuery){...}ですか?
Nigel Angel

2
@NigelAngel:うん、それは彼が意味することです:)
ChaseMoskal 2013年

12
これは、ページに複数のjQueryインスタンスがある場合は機能しません。
Georgii Ivankin 2014年

5
@CrescentFreshつまり、jQuery2を指す現在の名前空間に$があり、外部の名前空間($はjQuery1)からのオブジェクトがある場合、このオブジェクトがjQueryオブジェクトかどうかを確認するためにinstanceofを使用する方法がありません。
Georgii Ivankin 2014

6
ifステートメントの時点でjQueryがロードされているかどうかわからない場合は、エラーをスローせずにオペレーターが機能するために宣言する必要がないtypeof jQuery === 'function' && obj instanceof jQueryため、チェックを拡張できます。jQuerytypeof
Patrick Roberts

105

ここで説明するように、あなたも.jqueryプロパティを使用することがあります。http://api.jquery.com/jquery-2/

var a = { what: "A regular JS object" },
b = $('body');

if ( a.jquery ) { // falsy, since it's undefined
    alert(' a is a jQuery object! ');    
}

if ( b.jquery ) { // truthy, since it's a string
    alert(' b is a jQuery object! ');
}

12
ダビデは値がnullになる可能性があります変数のプロパティを確認し、問題の指摘(「」または「b」がヌルであればIE)安全ではない(それはTypeError例外がスローされます)。「b instanceof jQuery」を使用することをお勧めします。
rstackhouse 2012

23
この方法は、jQueryがロードされてb instanceof jQueryいない場合に機能し、ページでjQueryが使用できない場合はReferenceErrorをスローします。どちらの方法も、異なる場合に役立ちます。
2013年

おそらくもっと効率的ですが、それでも安全ではありません。try ... catch特にoldIEでは、が必要になる場合があります。
ClarkeyBoy 2013年

jQueryが読み込まれていない可能性がある場合は、次を使用できますif ((typeof jQuery !== 'undefined') && (obj instanceof jQuery)) {...
Harry Pehkonen

これはそのような良い例ではありませんa。DOMノードの可能性が高くなります。document.body理論的には、jqueryそのノードのチェーンの最上位にキーが存在する可能性があります。
vsync '13


26

オブジェクトのインスタンスをチェックする最良の方法は、instanceof演算子を使用するか、オブジェクトのプロトタイプが別のオブジェクトのプロトタイプチェーンにあるかどうかを検査するisPrototypeOf()メソッドを使用することです。

obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);

ただし、ドキュメントに複数のjQueryインスタンスがある場合、失敗することがあります。@Georgiy Ivankinが述べたように:

私が持っている場合$に私の現在の名前空間ポインティングにjQuery2、私は(ここで、外側の名前空間からオブジェクトを持って$いるjQuery1)、私は使用する方法がありませんinstanceofそのオブジェクトがあるかどうかをチェックするためにjQuery、オブジェクトを

その問題を克服する1つの方法は、クロージャーまたはIIFEでjQueryオブジェクトに別名を付けることです。

//aliases jQuery as $
(function($, undefined) {
    /*... your code */

    console.log(obj instanceof $);
    console.log($.prototype.isPrototypeOf(obj));

    /*... your code */
}(jQuery1));
//imports jQuery1

その問題を克服する他の方法は、jqueryプロパティを問い合わせることですobj

'jquery' in obj

ただし、プリミティブ値でそのチェックを実行しようとすると、エラーがスローされます。そのため、前のチェックを変更してobjObject

'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)) { }

ために強制ifステートメントは評価して短絡を行います&&時にオペレータをobjのいずれかであるfalsy値(nullundefinedfalse0"")、および、他の検証を実行するように進みます。

最後にユーティリティ関数を書くことができます:

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

見てみましょう:論理演算子と真/偽


しかし、それによってどのように安全性が向上しますか?jqueryプロパティを持つ非jQueryオブジェクトは依然として誤検出されます。両方のアプローチを使用して他に何が「改善」されるかはわかりません。
GuiPrá2015年

これは、オブジェクトがjQueryオブジェクトであるかどうかを確認する簡単な方法です。何らかの理由でjqueryなどのプロパティを持つオブジェクトを作成している疑いがある場合は、より堅牢なバリデーターを作成できます。つまり、プロトタイプの プロパティを確認しますmyObj .constructor.prototype.jqueryまたはより良いまだ、あなたは、関数を使用することができますObject.prototype.isPrototypeOf()
jherax

1
あなたの場合||とそれのいずれかが'jquery' in Object(obj)、しかし、それは非jQueryの検証を渡してから、そのプロパティを持つオブジェクト防ぐことはできませんので、排水に移行します。ただし、プロトタイプでそのプロパティをチェックすると状況が改善されると思います。多分それをあなたの答えに加えるべきです!私はここで他のどの回答もその可能性について言及しているとは思いません:)
グイプラ

1
obj.__proto__.jquery代わりにobj.constructor.prototype.jquery十分ではありませんか?ちょっと短いです:)
Axel

1
@Axelはい、それも動作します:) コンストラクタのインスタンスであるはずなconstructor.prototypeので、私はそれを使用しました。一方、あらゆる種類のオブジェクトに使用できます。objjQuery__proto__
jherax 2017

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

DOM要素を確認し、nodeTypeプロパティをより適切に使用し、boolean値が返されるようにするために、二重否定を使用できます!!(el && el.nodeType)
jherax


2

オブジェクトがjQueryがインストールされていないjQueryオブジェクトであるかどうかを知りたい場合は、次のスニペットで作業を行う必要があります。

function isJQuery(obj) {
  // Each jquery object has a "jquery" attribute that contains the version of the lib.
  return typeof obj === "object" && obj && obj["jquery"];
}

1

次のjqueryプロパティを使用して、オブジェクトがJQueryによって生成されたかどうかを確認できます。

myObject.jquery // 3.3.1

=>オブジェクトがJQueryによって生成された場合、JQueryバージョンの番号を返します。=>それ以外の場合は、undefined


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

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

elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE

11
説明なしのコードダンプが役立つことはほとんどありません。回答にコンテキストを追加することを検討してください。
Chris
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.