【发布时间】:2010-10-03 23:11:41
【问题描述】:
我正在编写一个 javascript 函数,并且在“紧凑”javascript 设计时尚中,参数的类型/长度会改变函数的行为。一种可能的参数类型是 jQuery 对象,我想要非常特殊的逻辑。
测试对象是否为 jQuery 实例的最佳方法是什么?
【问题讨论】:
标签: javascript jquery scripting
我正在编写一个 javascript 函数,并且在“紧凑”javascript 设计时尚中,参数的类型/长度会改变函数的行为。一种可能的参数类型是 jQuery 对象,我想要非常特殊的逻辑。
测试对象是否为 jQuery 实例的最佳方法是什么?
【问题讨论】:
标签: javascript jquery scripting
使用 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;
}
【讨论】:
取决于 jQuery 的内部工作原理,但我会选择
obj instanceof jQuery
这是最“JavaScript 方式”的做法。请记住,在窗口/框架边界之间传递对象时会失败!
托马拉克的建议
'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、duck-typing 和 toString.call() 的组合进行类型检查,这在 instanceof 将失败的地方应该可以工作。
此外,hasOwnProperty() 也从未使用过。我不确定这对 jQuery 库的代码质量有何影响;)
【讨论】:
【讨论】: