检查object是否是jQuery对象

大兔子大兔子 提交于 2020-01-07 01:58:36

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

有没有快速检查对象是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')


#1楼

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

#2楼

您可以使用instanceof运算符:

obj instanceof jQuery

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

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


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


#3楼

查看instanceof运算符。

var isJqueryObject = obj instanceof jQuery

#4楼

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

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

但有时在文档上有多个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

克服该问题的其他方法是通过查询objjquery属性

'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)) { }

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

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

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

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


#5楼

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

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

elObjeto.constructor == Array//FALSE
elObjeto.constructor == Object//TRUE
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!