有没有快速检查对象是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
return el instanceof jQuery ? el.size() > 0 : (el && el.tagName);
您可使用instanceof
运算符: 安全
obj instanceof jQuery
说明 : jQuery
函数(又名$
)是做为构造函数实现的 。 使用new
前缀调用构造函数。 闭包
当你调用$(foo)
,内部jQuery会将其转换为new jQuery(foo)
1 。 JavaScript继续在构造函数内初始化this
以指向jQuery
的新实例,将其属性设置为jQuery.prototype
(aka jQuery.fn
)上的属性。 所以,您将得到一个new
对象,其中instanceof jQuery
为true
。 ide
1 它其实是new jQuery.prototype.init(foo)
:构造函数逻辑已被卸载到另外一个名为init
构造函数,但概念是相同的。 函数
查看instanceof运算符。 this
var isJqueryObject = obj instanceof jQuery
检查对象实例的最佳方法是经过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
克服该问题的其余方法是经过查询obj
的jquery
属性
'jquery' in obj
可是,若是您尝试使用原始值执行该检查,则会抛出错误,所以您能够经过确保obj
成为Object
来修改先前的检查
'jquery' in Object(obj)
虽然前面的方法不是最安全的(您能够在对象中建立'jquery'
属性),但咱们能够经过使用这两种方法来改进验证:
if (obj instanceof jQuery || 'jquery' in Object(obj)) { }
这里的问题是任何对象均可以将属性jquery
定义为本身的,所以更好的方法是在原型中询问,并确保该对象不为null
或undefined
if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
因为强制 ,当obj
是任何伪值( null
, undefined
, false
, 0
, ""
)时, if
语句将经过评估&&
运算符来进行短路,而后继续执行其余验证。
最后咱们能够编写一个实用函数:
function isjQuery(obj) { return (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)); }
让咱们来看看: 逻辑运算符和truthy / falsy
var elArray = []; var elObjeto = {}; elArray.constructor == Array //TRUE elArray.constructor == Object//TALSE elObjeto.constructor == Array//FALSE elObjeto.constructor == Object//TRUE