检查object是否是jQuery对象

Dav*_*ing 587 javascript jquery

有没有快速检查对象是jQuery对象还是本机JavaScript对象的方法?

例:

var o = {};
var e = $('#element');

function doStuff(o) {
    if (o.selector) {
        console.log('object is jQuery');
    }
}

doStuff(o);
doStuff(e);
Run Code Online (Sandbox Code Playgroud)

显然,上面的代码有效,但不安全.您可以向o对象添加选择器键并获得相同的结果.有没有更好的方法来确保对象实际上是一个jQuery对象?

符合的东西 (typeof obj == 'jquery')

Cre*_*esh 856

您可以使用instanceof运营商:

obj instanceof jQuery
Run Code Online (Sandbox Code Playgroud)

说明:jQuery函数(aka $)是作为构造函数实现的.使用new前缀调用构造函数.

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


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

  • 如果页面上有多个jQuery实例,则不起作用. (12认同)
  • 所以你的意思是`if(obj instanceof jQuery){...}`? (7认同)
  • @CrescentFresh我的意思是如果我当前的命名空间中有$指向jQuery2并且我有一个来自外部命名空间的对象(其中$是jQuery1),而不是我无法使用instanceof来检查这个对象是否是一个jQuery对象. (5认同)
  • 如果你不确定在if语句时是否加载了jQuery,你可以将检查扩展为`typeof jQuery ==='function'&& obj instanceof jQuery`,因为`jQuery`不必在命令`typeof`运算符在不抛出错误的情况下工作. (5认同)
  • @NigelAngel:是的,这就是他的意思:) (2认同)
  • 当然这是一个边缘情况,但是`$(342)`返回一个JQuery对象,并且有长度([342]),但从技术上讲,它不是一个有效的JQuery对象,因为API不会对它起作用.(例如$(342).height()) (2认同)
  • 检查不是 jQuery 的元素是 `if(!(obj instanceof jQuery))`。需要双括号,不知道为什么。省略内部括号(像这样:`if(!obj instanceof jQuery)`)每次都会返回`false`。 (2认同)

mt8*_*t81 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! ');
}
Run Code Online (Sandbox Code Playgroud)

  • 如果没有加载jQuery,这种方式有效,而如果页面上没有jQuery,`b instanceof jQuery`会抛出ReferenceError.这两种方法在不同情况下都很有用. (22认同)
  • 正如[David](http://stackoverflow.com/users/210578/david)在问题中指出的那样,检查变量值的属性可能为null(即"a"或"b"为null)不安全(它会抛出一个TypeError).使用"b instanceof jQuery"更好. (12认同)

Cor*_*old 30

查看instanceof运算符.

var isJqueryObject = obj instanceof jQuery
Run Code Online (Sandbox Code Playgroud)


jhe*_*rax 24

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

obj instanceof jQuery;
jQuery.prototype.isPrototypeOf(obj);
Run Code Online (Sandbox Code Playgroud)

但有时在文档上有多个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
Run Code Online (Sandbox Code Playgroud)

克服这个问题的其他方法是通过查询jquery财产obj

'jquery' in obj
Run Code Online (Sandbox Code Playgroud)

但是,如果您尝试使用原始值执行该检查,则会抛出错误,因此您可以通过确保obj成为一个错误来修改先前的检查Object

'jquery' in Object(obj)
Run Code Online (Sandbox Code Playgroud)

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

if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
Run Code Online (Sandbox Code Playgroud)

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

if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
Run Code Online (Sandbox Code Playgroud)

由于强制,该if语句将作简短的电路通过评估&&当操作者obj是任何的falsy值(null,undefined,false,0,""),然后前进到执行其他的验证.

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

function isjQuery(obj) {
  return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery));
}
Run Code Online (Sandbox Code Playgroud)

让我们来看看:逻辑运算符和truthy/falsy


Kar*_*l.S 5

对于那些想知道一个对象是否是 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;
}
Run Code Online (Sandbox Code Playgroud)