检查对象是否是一个jQuery对象
有没有一种快速的方法来检查一个对象是一个jQuery对象还是一个本地JavaScript对象?
例:
var o = {}; var e = $('#element'); function doStuff(o) { if (o.selector) { console.log('object is jQuery'); } } doStuff(o); doStuff(e);
显然,上面的代码工作,但不安全。 您可以将select键添加到o
对象并获得相同的结果。 有没有更好的方法确保对象实际上是一个jQuery对象?
一些符合(typeof obj == 'jquery')
你可以使用instanceof
操作符:
obj instanceof jQuery
说明 : jQuery
函数(aka $
)是作为构造函数实现的 。 构造函数将使用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
构造函数,但概念是相同的。
您也可以使用如下所述的.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运算符或方法isPrototypeOf()来检查对象的原型是否在另一个对象的原型链中。
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)
虽然以前的方法并不是最安全的(可以在对象中创build'jquery'
属性),但是我们可以通过使用两种方法来改进validation:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
这里的问题是,任何对象可以定义一个属性jquery
作为自己的,所以更好的方法是要求在原型,并确保该对象不是null
或undefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
由于强制 ,当obj
是任何一个falsy值( null
, undefined
, false
, 0
, ""
)时, if
语句会通过评估&&
运算符来短路,然后继续执行其他validation。
最后我们可以编写一个实用函数:
function isjQuery(obj) { return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)); }
让我们看看: 逻辑运算符和真/假
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);
但是,还有一种方法来检查jQuery中的对象。
jQuery.type(a); //this returns type of variable.
我做了个例子来理解事物, jsfiddle链接
var elArray = []; var elObjeto = {}; elArray.constructor == Array //TRUE elArray.constructor == Object//TALSE elObjeto.constructor == Array//FALSE elObjeto.constructor == Object//TRUE