在JavaScript中,测试一个对象是否为jQuery对象的正确/适当方法是什么?

11

我正在编写一个 JavaScript 函数,并采用“紧凑”JavaScript 设计风格,函数的行为会根据参数的类型和长度来改变。参数的一种可能类型是 jQuery 对象,对于这种对象我需要使用非常特殊的逻辑。

如何最好地测试一个对象是否是 jQuery 的实例?

3个回答

20

取决于jQuery的内部运作,但我会选择

obj instanceof jQuery

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

Tomalak的建议。

'jquery' in obj

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

如果obj是原始值,则in运算符也会引发错误。 如果不希望出现此行为,则可以考虑使用以下测试之一:

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

我觉得第二个更吸引人,但是第一个可能会更快。

检查中...

Object(obj).hasOwnProperty('jquery')

由于 jQuery 对象仅从其原型继承该属性,因此将失败。

我还不建议在 JavaScript 中使用 constructor 属性进行类型检查 - 它可能对 jQuery 有效,但是由于 constructor 只是实例化时构造函数的 prototype 属性所指向的对象的属性,因此有很多方法可以干扰这种测试......


另外一件事:

jQuery 本身检查 obj && obj.jquery。它甚至没有使用一次 instanceof。相反,它使用 typeof、鸭子类型和 toString.call() 的组合进行类型检查,这应该能够在 instanceof 失败时工作。

此外,hasOwnProperty() 也从未被使用。我不确定这对于 jQuery 库的代码质量意味着什么 ;)


1
比我的帖子详细得多:+1,我建议选择你的帖子作为答案。 - VonC
你因提到 instanceof 在窗口/框架边界上的失败而获得了我的投票! - Crescent Fresh

6

以下之一:

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

instanceof 建议使用


我建议不要单独使用 instanceof,因为在 IE 中使用 instanceof 存在已知的内存泄漏问题。 - kflorence

0

使用此方法来测试 jQuery 对象,而不是使用 instanceof。

/**
 * @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;
}

为什么应该使用这个而不是 instanceof? - Kato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接