Javascript 我应该在什么时候将代码作为jQuery插件编写

Javascript 我应该在什么时候将代码作为jQuery插件编写,javascript,jquery,jquery-plugins,Javascript,Jquery,Jquery Plugins,假设没有其他类似的框架,并且忽略jQuery依赖性的潜在缺陷和潜在的性能开销 我想知道什么时候应该将一组内聚的JavaScript函数编码为jQuery插件。当然,这涉及到很多主观性和上下文——也许应该描述沿着jQuery路径走下去的最重要情况的目录 我的主要查询范围包括: jQuery插件结构与简单JavaScript对象相比的优势 是最有利于“链接”和在DOM级别上操作的插件。也就是说,jQuery插件应该专注于DOM操作吗 也许所有JavaScript编码场景都得益于结构化代码?“thi

假设没有其他类似的框架,并且忽略jQuery依赖性的潜在缺陷和潜在的性能开销

我想知道什么时候应该将一组内聚的JavaScript函数编码为jQuery插件。当然,这涉及到很多主观性和上下文——也许应该描述沿着jQuery路径走下去的最重要情况的目录

我的主要查询范围包括:

  • jQuery插件结构与简单JavaScript对象相比的优势
  • 是最有利于“链接”和在DOM级别上操作的插件。也就是说,jQuery插件应该专注于DOM操作吗
  • 也许所有JavaScript编码场景都得益于结构化代码?“this”的正确封装
我希望JavaScript代码是: -标准-易于阅读/修改 -更可预测 -在bug中最小化(让我们忽略IDE和咖啡脚本和其他技术,但要考虑减少人为错误的好处)

希望这个问题的描述足够清晰和狭窄,能够为所有JavaScript程序员在这个非常具体的设计问题上获得一些有用的答案。

什么是JQuery插件: JQuery插件是与扩展方法等价的JavaScript。让我们看看插件语法:

$.fn.stretch = function(multiple) {
    this.each(function() {
        var $t = $(this);
        $t.height($t.height * multiple);
        $t.width($t.width * multiple);

    });
    return this;
};
我已经创建了一个插件,它将通过多次传递选择的元素的高度和宽度相乘。(注意,这是为了演示而拼凑在一起的)

该方法对它所附加到的对象
$(this)
进行操作,并返回一个对象,从而允许进一步的操作

这里是一个很好的指南,介绍了一系列的——一些用于优化性能,另一些用于互操作性/链接性、易变性等


JQuery插件的好处: 1)链接

$('#smallDiv').css("background-color", "beige").stretch(2);
2)可重用性

我承认这是一个强迫的例子,但仍然

$('#smallDiv').stretch(2).stretch(1.5);
3)范围的模块化

我们插件中的代码不需要担心变量范围。它是完全独立的,只使用局部变量

4)可读性

这里我假设您的插件的名称是正确的


到DOM还是不到DOM: 插件在许多方面都很有用

我怀疑90%的插件用于DOM操作。连锁是一个很大的优势

但是JQuery已经有了许多数组扩展方法:

$.distinct([1, 2, 2, 3])
$.union([1, 2, 2, 3], [2, 3, 4, 5, 5])
$.intersect([1, 2, 2, 3], [2, 3, 4, 5, 5])
$.except([1, 2, 2, 3], [2, 3, 4, 5, 5])
(我从克里斯蒂安·亚伯拉罕森那里借的)

和字符串、cookie等插件存在,可以/应该考虑


JQuery插件的缺点: Global并不总是高贵的:你漂亮的新
stretch()
插件可以用于任何东西。这是好还是坏?由你决定。谁应该使用它?谁不应该?应该在哪些元素上使用它

如果不希望重复使用,请不要创建插件。我相信你们团队中的很多开发人员都太有创造力了

计划是必须的请参阅此Brolick博客


在Brolick指南和patterns参考之间,您会注意到,草率的插件开发可能会导致许多错误和问题。其中最常见的是性能差内存泄漏。两者都被低估了,这是潜在的严重性,并且在插件开发中非常猖獗和频繁。

这是非常主观的。答案是:只要你愿意。它是一段您认为可以在其他项目中使用的代码,还是其他人可能需要的代码,它是否使用jQuery?那么也许你想要一个插件。@Todd当然有时候是个坏主意,有时候是个好主意。“但归根结底,这是主观的。”蜥蜴比尔·戴夫(bill the lizard Dave)下面的回答到目前为止看起来很不错,我不认为这是基于我的观点。我希望这个问题可能会出现在ars technica上,ars technica经常处理这样的问题。看看它得到了多少视图,很多程序员都在寻找答案,但是没有人给出答案,所以我加了一笔奖金,现在版主突然认为它是“基于视图的”?这是一个非常主观的问题。仅仅因为它以前没有被注意到,并不意味着它现在应该继续开放。不管它有多少浏览量,也不管你希望它在什么地方被展示,这都是离题的。
$.distinct([1, 2, 2, 3])
$.union([1, 2, 2, 3], [2, 3, 4, 5, 5])
$.intersect([1, 2, 2, 3], [2, 3, 4, 5, 5])
$.except([1, 2, 2, 3], [2, 3, 4, 5, 5])