在javascript中测试对象是否是jQuery对象的正确/正确方法是什么?

时间:2009-01-28 08:28:58

标签: javascript jquery scripting

我正在编写一个javascript函数,并且在“紧凑”的javascript设计方式中,参数的类型/长度会改变函数的行为。一种可能的参数类型是jQuery对象,我想要非常特殊的逻辑。

测试对象是否是jQuery实例的最佳方法是什么?

3 个答案:

答案 0 :(得分:20)

取决于jQuery的内部工作原理,但我会选择

obj instanceof jQuery

这是实现它的最“JavaScript方式”。请记住,在窗口/框架边界之间传递对象时会失败!

Tomalak的建议

'jquery' in obj

在这种情况下仍然可以工作,因此如果您希望进行多窗口数据交换,则应该使用它。我不建议将其作为一般解决方案,因为只是寻找名为'jquery'的属性并不是非常可靠。

如果in是基元,obj运算符也会抛出错误。如果不希望出现这种情况,您可以考虑使用其中一种测试:

obj && obj.jquery
'jquery' in Object(obj)

我发现第二个更吸引人,但第一个可能会更快。

检查

Object(obj).hasOwnProperty('jquery')

将失败,因为jQuery对象只从其原型继承属性。

我也不鼓励在JavaScript中使用constructor属性进行类型检查 - 它可能对jQuery可靠地工作,但因为constructor只是构造函数的prototype所指向的对象的属性。 {1}}在实例化时的属性,有很多方法可以搞乱这些测试......


作为旁注:

jQuery本身会检查obj && obj.jquery。它甚至不使用instanceof一次。相反,它使用typeof,duck-typing和toString.call()的组合进行类型检查,这应该在instanceof失败的情况下起作用。

此外,hasOwnProperty()也从未被使用过。我不确定这说明jQuery库的代码质量;)

答案 1 :(得分:6)

以下其中一项:

obj instanceof jQuery
obj && obj.constructor == jQuery
obj && obj.jquery 

instanceof is recommended

答案 2 :(得分:0)

使用this而不是instanceof来测试jQuery对象。

/**
 * @see http://ajaxian.com/archives/working-aroung-the-instanceof-memory-leak
 * @return Boolean True if object is of type jQuery, false otherwise
 */
function isjQuery(obj) {
    return obj && obj.hasOwnProperty && obj instanceof jQuery;
}