检查object是否是jQuery对象

时间:2009-12-05 19:43:17

标签: javascript 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')

的内容

9 个答案:

答案 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 jQuerytrue


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

但是,如果您尝试使用原始值执行该检查,则会抛出错误,因此您可以通过确保objObject

来修改之前的检查
'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> 值(objnullundefinedfalse0),然后继续执行其他验证。

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

""

我们来看看:Logical Operators and truthy / falsy

答案 4 :(得分:3)

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

答案 5 :(得分:3)

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

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

我已经举例说明了事情,jsfiddle link

答案 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