为什么在JQuery/JavaScript中使用extend?

4 javascript jquery design-patterns jquery-ui

在下面的JQuery UI小部件中,作者使用了extend来包含两个以上的函数$.ui.autocomplete,为什么?这是一个特定于JQuery的模式还是我可以在普通的JS中考虑的东西?

$.extend( $.ui.autocomplete, {
escapeRegex: function( value ) {
    return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
},
filter: function(array, term) {
    var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
    return $.grep( array, function(value) {
        return matcher.test( value.label || value.value || value );
    });
}
});
Run Code Online (Sandbox Code Playgroud)

https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.autocomplete.js#L385

Mon*_*der 10

没有理由使用它,实际上它比手动常规JS方式慢.jQuery开发人员常常遇到一个问题,他们只知道如何使用jQuery而不是常规的javascript.与自己管理事物相比,jQuery的扩展函数是一个递归实际上相当慢的野兽.

*编辑*由于人们似乎不想接受这个答案,让我说明为什么没有理由.

如果你在github上查看jQuery的代码:https://github.com/jquery/jquery/blob/master/src/core.js你会在313行找到jQuery.extend的定义.

首先,让我们看一下非jQuery扩展方式的必要性.

$.ui.autocomplete.escapeRegex = function() {}
$.ui.autocomplete.filter = function() {}
Run Code Online (Sandbox Code Playgroud)

两个定义,没有函数调用.非常简单快速的代码.

这是jQuery在使用extend时所做的事情.

在315行,我们看到了一个快速的小测试来组织一些参数.接下来,我们有另一个可能代码执行的小IF语句.接下来是另一个在if内部调用函数的IF.接下来是另一个IF.然后我们为每个参数输入一个FOR循环,在我们的例子中是两轮.在每次传递中,首先检查空值,因为我们自己完成了这些功能所以在我们的情况下是不必要的.现在我们有一个FOR IN循环,由于必须查找对象映射中的每个项而不是迭代迭代器,因此本质上非常慢.现在我们最终将我们的一个函数复制到jQuery中!做另一次检查,以确保我们不进入无限循环...对于我们的情况这次我们只做一个小的IF检查.循环重复直到完成任务.

因此,这种方法比直接复制到jQuery对象本身慢得多.对于使用API​​的人来说,一个常见的问题是即使功能使用可能很简单,看起来既快速又容易,但与自己做事相比,内部结构可能非常复杂和缓慢.

  • 如果自动完成对象随时被销毁,那么您的功能将随之消失.Extend不会修改原型.如果你想这样做,你需要自己做.如果你不相信我的解释只是因为它是downvoted尝试自己掀起一个小测试案例,你可以看到行动:).我可能被那些不喜欢他们的图书馆被淘汰的jQuery粉丝们所淹没.但是哦,好吧,你自己看看扩展代码,你可以看到我的解释非常准确. (2认同)