【问题标题】:What's the correct/proper way to test if an object is a jQuery object in javascript?测试对象是否是javascript中的jQuery对象的正确/正确方法是什么?
【发布时间】:2010-10-03 23:11:41
【问题描述】:

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

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

【问题讨论】:

    标签: javascript jquery scripting


    【解决方案1】:

    使用 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;
    }
    

    【讨论】:

    • 为什么要使用 this 而不是 instanceof?
    【解决方案2】:

    取决于 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 库的代码质量有何影响;)

    【讨论】:

    • 比我的帖子详细得多:+1,我建议选择您的帖子作为答案
    • 你因为提到 instanceof 跨越窗口/框架边界的失败而获得了我的投票!
    【解决方案3】:

    以下之一:

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

    is recommended 的实例

    【讨论】:

    • 我建议不要单独使用instanceof,因为在IE中使用instanceof时有known memory leaks
    猜你喜欢
    • 2010-10-28
    • 2016-04-24
    • 2018-08-16
    • 2013-05-31
    • 2017-04-17
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    相关资源
    最近更新 更多