发布于: jQuery UI > Widget Factory

为什么使用小部件工厂(Widget Factory)?

编写 jQuery 插件非常简单,只需向 jQuery.prototype(通常称为 $.fn)添加一个方法,并遵循一些简单的约定(如返回 this 以实现链式调用)即可。那么,为什么还会存在部件工厂?为什么它的代码量长达数百行?

在本文档中,我们将逐一探讨部件工厂的优势,并了解在何时以及为什么要使用它。

link 无状态 vs. 有状态插件

大多数 jQuery 插件是无状态的;它们执行某些操作后任务就完成了。例如,如果您使用 .text( "hello" ) 设置元素的文本,则没有初始化阶段,且结果总是一样的。对于这类插件,直接扩展 jQuery 的原型是有意义的。

然而,有些插件是有状态的;它们拥有完整的生命周期、维持状态并对变化做出反应。这些插件需要大量代码用于初始化和状态管理(有时还包括销毁)。这导致在构建有状态插件时会产生大量的样板代码。更糟糕的是,每个插件作者管理生命周期和状态的方式可能各不相同,从而导致不同插件的 API 风格迥异。部件工厂旨在解决这两个问题:消除样板代码,并在不同插件之间创建一致的 API。

link 一致的 API

部件工厂定义了如何创建和销毁部件、获取和设置选项、调用方法以及监听部件触发的事件。通过使用部件工厂来构建有状态插件,您将自动符合定义的标准,使新用户更容易上手您的插件。除了定义接口外,部件工厂还为您实现了大部分这些功能。如果您不熟悉部件工厂提供的 API,建议阅读 jQuery UI 的工作原理

link 在初始化时设置选项

每当您构建一个接受选项的插件时,都应该尽可能为选项定义默认值,然后在初始化时将用户提供的选项与默认值合并。公开默认值也是一个好主意,这样用户甚至可以更改默认值。jQuery 插件中常见的一种模式如下所示:

1
2
3
4
5
6
7
8
9
10
$.fn.plugin = function( options ) {
options = $.extend( {}, $.fn.plugin.defaults, options );
// Plugin logic goes here.
};
$.fn.plugin.defaults = {
param1: "foo",
param2: "bar",
param3: "baz"
};

部件工厂提供了此功能,甚至做得更多。让我们看看在部件工厂中这是什么样子的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$.widget( "ns.plugin", {
// Default options.
options: {
param1: "foo",
param2: "bar",
param3: "baz"
},
_create: function() {
// Options are already merged and stored in this.options
// Plugin logic goes here.
}
});