Javascript 检查对象是否为jQuery对象
是否有一种快速检查对象是jQuery对象还是本机JavaScript对象的方法 例如:Javascript 检查对象是否为jQuery对象,javascript,jquery,Javascript,Jquery,是否有一种快速检查对象是jQuery对象还是本机JavaScript对象的方法 例如: var o = {}; var e = $('#element'); function doStuff(o) { if (o.selector) { console.log('object is jQuery'); } } doStuff(o); doStuff(e); 显然,上面的代码可以工作,但并不安全。您可能会向o对象添加一个选择器键,并获得相同的结果。有没有更好的
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”)一致的内容
您可以使用运算符:
if (obj instanceof jQuery){
console.log('object is jQuery');
}
解释:将jQuery
函数(aka$
)作为。构造函数将使用new
前缀调用
当您调用$(foo)
时,jQuery会在内部将其转换为newjQuery(foo)
1。JavaScript继续在构造函数中初始化这个
,指向jQuery
的新实例,将其属性设置为jQuery.prototype
(akajQuery.fn
)上的属性。因此,您将得到一个新的
对象,其中jQuery的实例
为true
1它实际上是新的jQuery.prototype.init(foo):构造函数逻辑已被卸载到另一个名为
init
的构造函数中,但概念是相同的。查看操作符
var isJqueryObject = obj instanceof jQuery
您还可以使用.jquery属性,如下所述:
检查对象实例的最佳方法是通过操作符或使用检查对象原型是否在另一个对象的原型链中的方法。 jQuery的obj实例; jQuery.prototype.isPrototypeOf(obj); 但有时,如果一个文档上有多个jQuery实例,它可能会失败。正如@Georgiy Ivankin提到的: 如果我在当前命名空间中有指向
jQuery2
的$
,并且我有一个来自外部命名空间的对象(其中$
是jQuery1
),那么我无法使用instanceof
检查该对象是否是jQuery
对象
克服该问题的一种方法是将jQuery对象别名为或
//将jQuery别名为$
(函数($,未定义){
/*…您的代码*/
log(obj instanceof$);
log($.prototype.isPrototypeOf(obj));
/*…您的代码*/
}(jQuery1));
//进口jQuery1
克服该问题的另一种方法是查询obj
obj中的jquery
但是,如果您尝试使用原语值执行该检查,它将抛出一个错误,因此您可以通过确保obj
成为对象来修改以前的检查
对象(obj)中的“jquery”
虽然前面的方法不是最安全的(您可以在对象中创建'jquery'
属性),但我们可以通过使用这两种方法来改进验证:
if(对象(obj)中jQuery | |'jQuery'的obj实例){
这里的问题是,任何对象都可以将属性jquery
定义为自己的,因此更好的方法是在原型中询问,并确保该对象不是null
或未定义的
if(obj&&(obj instanceof jQuery | | obj.constructor.prototype.jQuery)){
由于强制,if
语句将在obj
是任何falsy值(null
,未定义
,false
,0
,“
)时,通过评估运算符而产生短路,然后继续执行其他验证
最后,我们可以编写一个实用函数:
函数isjQuery(obj){
返回(obj&(obj instanceof jQuery | | obj.constructor.prototype.jQuery));
}
让我们看一看:但是,还有一种方法可以检查jQuery中的对象
jQuery.type(a); //this returns type of variable.
我举了一个例子来理解一些事情,对于那些想知道一个对象是否是jQuery对象而没有安装jQuery的人来说,下面的代码片段应该可以完成这项工作:
function isJQuery(obj) {
// Each jquery object has a "jquery" attribute that contains the version of the lib.
return typeof obj === "object" && obj && obj["jquery"];
}
您可以使用JQuery
属性检查对象是否由JQuery生成:
myObject.jquery // 3.3.1
=>返回JQuery版本号,如果该对象是由JQuery生成的。
=>否则,它将返回问题中指出的未定义的,检查值可能为null的变量的属性(即如果“a”或“b”为null)是不安全的(它将抛出类型错误)。使用“b instanceof jQuery”更好。如果jQuery没有加载,这种方法可以工作,而b instanceof jQuery
如果jQuery在页面上不可用,则抛出一个引用错误。这两种方法在不同的情况下都很有用。可能更有效,但仍然不安全。它可能需要尝试。。。catch
,尤其是在旧版本中。如果可能没有加载jQuery,则可以使用if((jQuery的类型!=='undefined')&&(jQuery的obj实例)){…
这不是一个很好的例子。{code>a
很可能是一个DOM节点,比如document.body
,然后,理论上有可能jquery
键不知何故出现在该节点链的顶端。那么你的意思是if(obj instanceof jquery){…}
?@NigelAngel:是的,这就是他的意思:)如果一个页面上有多个jQuery实例,这是不起作用的。@CrescentFresh我的意思是,如果我当前命名空间中有$指向jQuery2,而我有一个来自外部命名空间的对象(其中$是jQuery1)因此,我无法使用instanceof检查此对象是否为jQuery对象。如果您不确定在执行if语句时是否加载了jQuery,则可以将检查扩展为typeof jQuery==='function'&&obj instanceof jQuery
,因为jQuery
不必为typeof声明e> 接线员到
jQuery.type(a); //this returns type of variable.
function isJQuery(obj) {
// Each jquery object has a "jquery" attribute that contains the version of the lib.
return typeof obj === "object" && obj && obj["jquery"];
}
myObject.jquery // 3.3.1