是否有快速检查对象是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')
答案 0 :(得分:838)
您可以使用instanceof
运算符:
obj instanceof jQuery
解释:jQuery
函数(又名$
)实现为constructor function。使用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
的构造函数,但概念是相同的。
答案 1 :(得分: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! ');
}
答案 2 :(得分:30)
查看instanceof运营商。
var isJqueryObject = obj instanceof jQuery
答案 3 :(得分:23)
检查对象实例的最佳方法是通过 instanceof运算符或方法isPrototypeOf()检查对象的原型是否在另一个对象的原型中链。
obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
但有时在文档上有多个jQuery实例的情况下可能会失败。正如@Georgiy Ivankin所说:
如果我当前的命名空间中有
$
指向jQuery2
并且我有一个来自外部命名空间的对象(其中$
是jQuery1
)那么我有无法使用instanceof
检查该对象是否为jQuery
对象
解决该问题的一种方法是将jQuery对象别名化为 closure 或 IIFE
//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
但是,如果您尝试使用原始值执行该检查,则会抛出错误,因此您可以通过确保obj
为Object
'jquery' in Object(obj)
虽然前面的方法不是最安全的(您可以在对象中创建'jquery'
属性),但我们可以通过使用这两种方法来改进验证:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
这里的问题是任何对象都可以将属性jquery
定义为自己的,因此更好的方法是在原型中询问,并确保对象不是null
或{{1 }}
的 强>
undefined
强> <强> 强>
由于强制,当if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
是任何 falsy {}时,if
语句会通过评估&&
运算符来缩短em> 值(obj
,null
,undefined
,false
,0
),然后继续执行其他验证。
最后我们可以编写一个实用函数:
""
答案 4 :(得分:3)
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);
答案 5 :(得分:3)
答案 6 :(得分: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"];
}
答案 7 :(得分:1)
您可以使用jquery
属性检查对象是否由JQuery生成:
myObject.jquery // 3.3.1
=>如果JQuery产生对象,则返回JQuery版本号。
=>否则,它将返回undefined
答案 8 :(得分:-10)
var elArray = [];
var elObjeto = {};
elArray.constructor == Array //TRUE
elArray.constructor == Object//TALSE
elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE