检查object是否为jQuery对象

是否有一种快速的方法来检查一个对象是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')一致

194312 次浏览

你可以使用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 jQuerytrue


# EYZ2 # EYZ3

检查运算符操作符。

var isJqueryObject = obj instanceof jQuery

你也可以像下面描述的那样使用.jquery属性

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! ');
}
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);
检查一个对象的实例的最好方法是通过instanceof操作符或使用方法isPrototypeOf ()来检查一个对象的原型是否在另一个对象的原型链中。

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

但有时在文档上有多个jQuery实例的情况下可能会失败。正如@Georgiy Ivankin提到的:

如果我有$在我当前的命名空间指向jQuery2,我有一个对象从外部命名空间(其中$jQuery1),那么我没有办法使用instanceof检查对象是否为jQuery对象

克服这个问题的一种方法是将jQuery对象混叠在闭包IIFE

//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

但是,如果您尝试使用原语值执行该检查,它将抛出一个错误,因此您可以通过确保objObject来修改前面的检查

'jquery' in Object(obj)

虽然前面的方法不是最安全的(你可以在对象中创建'jquery'属性),但我们可以通过使用这两种方法来改进验证:

if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
这里的问题是,任何对象都可以将属性jquery定义为own,因此更好的方法是在原型中询问,并确保对象不是nullundefined

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

由于强迫,当obj< em > falsy < / em >中的任何值(nullundefinedfalse0"")时,if语句将通过计算&&运算符而短路,然后继续执行其他验证

最后我们可以写一个效用函数:

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

让我们来看看:逻辑运算符和真/假

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


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


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

但是,在jQuery中还有一种检查对象的方法。

jQuery.type(a); //this returns type of variable.

我已经以身作则了,jsfiddle链接

对于那些想要在没有安装jQuery的情况下知道一个对象是否是jQuery对象的人来说,下面的代码片段应该可以完成工作:

function isJQuery(obj) {
// All jQuery objects have an attribute that contains the jQuery version.
return typeof obj === "object" && obj != null && obj.jquery != null;
}

你可以使用jquery属性检查对象是否由JQuery生成:

myObject.jquery // 3.3.1

=>返回由JQuery生成的对象的JQuery版本号。 =>否则返回undefined