オブジェクトが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')
に沿ったもの
instanceof
演算子を使用できます。
obj instanceof jQuery
説明:jQuery
関数(別名$
)は コンストラクター関数 として実装されています。コンストラクタ関数はnew
という接頭辞を付けて呼び出されます。
$(foo)
を呼び出すと、内部的にjQueryはこれをnew jQuery(foo)
に変換します。1。 JavaScriptは、this
の新しいインスタンスを指すようにコンストラクタ関数内でjQuery
を初期化し、そのプロパティをjQuery.prototype
(別名jQuery.fn
)にあるものに設定します。したがって、instanceof jQuery
がnew
であるtrue
オブジェクトが得られます。
1それは実際にはnew jQuery.prototype.init(foo)
です:コンストラクタロジックはinit
と呼ばれる別のコンストラクタ関数にオフロードされました、しかし概念は同じです。
ここで説明しているように、.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! ');
}
instanceof 演算子を調べてください。
var isJqueryObject = obj instanceof jQuery
オブジェクトのインスタンスをチェックする最善の方法はinstanceof operatorまたはオブジェクトのプロトタイプが別のオブジェクトのプロトタイプにあるかどうかを調べる isPrototypeOf() )を使うことです。プロトタイプチェーン.
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
しかし、ドキュメントに複数のjQueryインスタンスがあると失敗することがあります。 @Georgiy Ivankinが述べたように:
現在のネームスペースに
$
を指すjQuery2
があり、外側のネームスペースからのオブジェクトがある場合($
はjQuery1
である場合)、そのオブジェクトがinstanceof
name__オブジェクトであるかどうかを確認するのにjQuery
name__を使用する方法はありません
この問題を解決する1つの方法は、jQueryオブジェクトをクロージャまたはIIFE)にエイリアスすることです。
//aliases jQuery as $
(function($, undefined) {
/*... your code */
console.log(obj instanceof $);
console.log($.prototype.isPrototypeOf(obj));
/*... your code */
}(jQuery1));
//imports jQuery1
この問題を解決する他の方法は、jquery
name__のobj
name__プロパティを問い合わせることです。
'jquery' in obj
ただし、そのプリミティブ値を使用してそのチェックを実行しようとするとエラーが発生するため、obj
name__をObject
name__にすることで前のチェックを変更できます。
'jquery' in Object(obj)
これまでの方法が最も安全というわけではありませんが(オブジェクト内に'jquery'
プロパティを作成することができます)、次の2つの方法を併用して検証を向上させることができます。
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
ここでの問題は、どのオブジェクトもそれ自身としてプロパティjquery
name__を定義できることです。そのため、より良い方法はプロトタイプで問い合わせて、オブジェクトがnull
name__またはundefined
name__ではないことを確認することです。
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
coercionのため、if
name__がfalsyvalues(obj
name__、null
name__)のいずれかである場合、undefined
name__ステートメントは&&
演算子を評価することによって短絡になります。 、false
name__、0
、""
)を入力してから、他の検証の実行に進みます。
最後に、効用関数を書くことができます。
function isjQuery(obj) {
return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
見てみましょう: 論理演算子と真実/ falsy
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);
しかし、jQueryでオブジェクトをチェックするもう1つの方法があります。
jQuery.type(a); //this returns type of variable.
私は物事を理解するために例を作りました、 jsfiddle link
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"];
}
オブジェクトがjquery
プロパティを使用してJQueryによって生成されたものかどうかを確認できます。
myObject.jquery // 3.3.1
=>オブジェクトがJQueryによって生成された場合はJQueryのバージョン番号を返します。 =>それ以外の場合、undefined
を返します。