我正在编写一个javascript函数,并且在“紧凑”的javascript设计方式中,参数的类型/长度会改变函数的行为。一种可能的参数类型是jQuery对象,我想要非常特殊的逻辑。
测试对象是否是jQuery实例的最佳方法是什么?
答案 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;
}