检查对象是否是 jQuery 对象

IT技术 javascript jquery
2021-01-27 11:54:19

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

6个回答

您可以使用instanceof运算符:

if (obj instanceof jQuery){
    console.log('object is jQuery');
}

说明jQuery函数(又名$)是作为构造函数实现的将使用new前缀调用构造函数

当您调用时$(foo),jQuery内部将其转换为new jQuery(foo)1JavaScript 继续this在构造函数内部初始化以指向 的新实例jQuery,将其属性设置为在jQuery.prototype(又名jQuery.fn上找到的属性因此,您会得到一个new对象 where instanceof jQueryis true


1它实际上是new jQuery.prototype.init(foo):构造函数逻辑已卸载到另一个名为 的构造函数init,但概念是相同的。

如果您不确定在执行 if 语句时是否加载了 jQuery,您可以将检查扩展为,typeof jQuery === 'function' && obj instanceof jQuery因为jQuery不必声明typeof操作符就可以在不抛出错误的情况下工作。
2021-03-18 11:54:19
这在页面上有多个 jQuery 实例的情况下不起作用。
2021-03-22 11:54:19
@CrescentFresh 我的意思是,如果我在当前命名空间中有 $ 指向 jQuery2 并且我有一个来自外部命名空间的对象(其中 $ 是 jQuery1),那么我无法使用 instanceof 来检查这个对象是否是一个 jQuery 对象。
2021-04-02 11:54:19
所以你的意思是if (obj instanceof jQuery){...}
2021-04-08 11:54:19
@NigelAngel:是的,这就是他的意思:)
2021-04-11 11:54:19

您也可以使用 .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! ');
}
也许更有效,但仍然不安全。它可能需要try ... catch,尤其是在 oldIE 中。
2021-03-14 11:54:19
正如大卫在问题中指出的那样,检查值可能为空的变量的属性(即,如果“a”或“b”为空)是不安全的(它会抛出 TypeError)。使用“b instanceof jQuery”更好。
2021-03-20 11:54:19
在可能未加载 jQuery 的情况下,您可以使用 if ((typeof jQuery !== 'undefined') && (obj instanceof jQuery)) {...
2021-03-25 11:54:19
如果 jQuery 未加载,这种方式有效,而b instanceof jQuery如果 jQuery 在页面上不可用,则抛出 ReferenceError。这两种方法在不同的情况下都很有用。
2021-03-29 11:54:19
这不是一个很好的例子..更有可能a是一个 DOM 节点,document.body然后,理论上有可能以jquery某种方式密钥置于该节点的链之上。
2021-04-07 11:54:19

查看instanceof运算符。

var isJqueryObject = obj instanceof jQuery

检查对象实例的最佳方法是通过instanceof运算符或使用isPrototypeOf()方法检查对象的原型是否在另一个对象的原型链中。

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

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

如果我$在我当前的命名空间中指向jQuery2并且我有一个来自外部命名空间(where $is 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

其他与解决这一问题的方法是通过询问jquery物业obj

'jquery' in obj

但是,如果您尝试使用原始值执行该检查,则会引发错误,因此您可以通过确保obj是一个Object

'jquery' in Object(obj)

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

if (obj instanceof jQuery || 'jquery' in Object(obj)) { }

这里的问题是任何对象都可以将属性定义jquery为自己的,因此更好的方法是在原型中询问,并确保该对象不是nullundefined

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

由于coercion是任何值 ( , , , , ) 时,if语句将通过评估&&运算符来短路,然后继续执行其他验证。objnullundefinedfalse0""

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

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

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

但是,如果您||使用 a 中的任何一个'jquery' in Object(obj),它就会耗尽,因为它不会阻止具有该属性的非 jQuery 对象通过验证。不过,我确实相信在原型中检查该属性会改善这种情况。也许您应该将其添加到您的答案中!我认为这里没有任何其他答案提到这种可能性:)
2021-03-25 11:54:19
@Axel 是的,它也有效:)。我使用了constructor.prototype因为obj应该是构造函数的一个实例,即jQuery. 另一方面__proto__可用于任何类型的对象。
2021-04-01 11:54:19
这是检查对象是否是 jQuery 对象的简单方法,如果出于任何原因怀疑有人正在创建具有诸如jquery 之类的属性的对象,那么您可以创建一个更健壮的验证器,即检查原型中的 属性myObj .constructor.prototype.jquery或更好的,你可以使用函数Object.prototype.isPrototypeOf()
2021-04-03 11:54:19
但是,这如何提高安全性?具有 jquery 属性的非 jQuery 对象仍然会被误检测到。我也看不出使用这两种方法还有什么可能“改进”。
2021-04-05 11:54:19
不是obj.__proto__.jquery的,而不是obj.constructor.prototype.jquery就够了吗?只是有点短:)
2021-04-05 11:54:19

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

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

我做了例子来理解事物,jsfiddle链接