有没有一种快速检查对象是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')
的东西
8 回答
您可以使用instanceof运算符:
Explanation :
jQuery
函数(又名$
)实现为constructor function . 使用new
前缀调用构造函数 .当您调用
$(foo)
时,内部jQuery将其转换为new jQuery(foo)
1. JavaScript继续在构造函数内初始化this
以指向jQuery
的新实例,将其属性设置为jQuery.prototype
(又名jQuery.fn
)上的属性 . 因此,您得到一个new
对象,其中instanceof jQuery
是true
.1它实际上是新的jQuery.prototype.init(foo):构造函数逻辑已被卸载到另一个名为init的构造函数,但概念是相同的 .
您也可以使用此处所述的.jquery属性:http://api.jquery.com/jquery-2/
查看instanceof运算符 .
检查对象实例的最佳方法是通过 instanceof operator 或方法isPrototypeOf(),它检查对象的原型是否在另一个对象的原型链中 .
但有时在文档上有多个jQuery实例的情况下可能会失败 . 正如@Georgiy Ivankin所说:
解决该问题的一种方法是在 closure 或 IIFE 中对jQuery对象进行别名处理
克服该问题的其他方法是通过查询
obj
中的jquery
属性但是,如果您尝试使用原始值执行该检查,则会抛出错误,因此您可以通过确保
obj
为Object
来修改先前的检查虽然前面的方法不是最安全的(您可以在对象中创建
'jquery'
属性),但我们可以通过使用这两种方法来改进验证:这里的问题是任何对象都可以将属性
jquery
定义为自己的属性,因此更好的方法是在原型中询问,并确保该对象不是null
或undefined
****if (obj && (obj instanceof jQuery || obj.constructor.prototype.jquery)) { }
**** 由于 coercion ,当
obj
是 falsy 值(null
,undefined
,false
,0
,""
)中的任何一个时,if
语句将通过评估&&
运算符进行短路,然后继续执行其他验证 .最后我们可以编写一个实用函数:
我们来看看:Logical Operators and truthy / falsy
但是,还有一种方法可以在jQuery中检查对象 .
我已经做了一些了解事情的例子,jsfiddle link
对于那些想要在没有安装jQuery的情况下想知道某个对象是否是jQuery对象的人,以下代码片段应该可以完成这项工作: