检查object是不是jQuery对象

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

例: java

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

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

doStuff(o);
doStuff(e);

显然,上面的代码有效,但不安全。 您能够将选择键添加到o对象并得到相同的结果。 有没有更好的方法来确保对象其实是一个jQuery对象? jquery

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


#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 jQuerytrueide


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


#3楼

查看instanceof运算符。 this

var isJqueryObject = obj instanceof jQuery

#4楼

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

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
相关文章
相关标签/搜索