我正在编写一个 JavaScript 函数,并采用“紧凑”JavaScript 设计风格,函数的行为会根据参数的类型和长度来改变。参数的一种可能类型是 jQuery 对象,对于这种对象我需要使用非常特殊的逻辑。
如何最好地测试一个对象是否是 jQuery 的实例?
我正在编写一个 JavaScript 函数,并采用“紧凑”JavaScript 设计风格,函数的行为会根据参数的类型和长度来改变。参数的一种可能类型是 jQuery 对象,对于这种对象我需要使用非常特殊的逻辑。
如何最好地测试一个对象是否是 jQuery 的实例?
取决于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 库的代码质量意味着什么 ;)
使用此方法来测试 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;
}