深入研究javascript和插件,我正在研究一些现有代码--jQuery的tokenImput插件。
这实际上是一个更通用的问题 - 为什么内部的“主力”对象TokenList
以jquery的$
为前缀(即为什么要将它添加到jquery的名称空间)?
以下是相关说明:
// Expose the .tokenInput function to jQuery as a plugin
$.fn.tokenInput = function(method) {
... this is the "public" entry point ...
... which, simplified, does something like this
... to crank up the pluging functionality
new $.TokenList(this, url_or_data_or_function, settings));
};
// TokenList class for each input
$.TokenList = function(input, url_or_data, settings) {
//
// Initialization
//
// Configure the data source
if ($.type(url_or_data) === "string" || $.type(url_or_data) === "function") {
... this is the encapsulation
... that doesn't seem logical to belong to jQuery ...
插件通过tokenInput
使用:
$(element).tokenInput(svcUrl, {...});
答案 0 :(得分:1)
为什么内部的“workhorse”对象以jquery的
$
为前缀(即为什么要将它添加到jquery的命名空间中)?
因为它比全局命名空间更适合。这是一个 jQuery 插件在没有jQuery的情况下不起作用,所以这是合理的,避免了全局范围的污染。
还可以在闭包中隐藏构造函数(并仅导出$.fn.tokenInput
方法),但通过将其公开,可以扩展该类。
在jQuery名称空间中放置插件的“静态”部分(公共类,全局配置对象,辅助函数等)是common practise,就像使用“本机”jQuery一样函数(utilities或构造函数,如Event
,Deferred
等)。但是,最好将静态属性命名为原型方法,因此TokenInput
而不是TokenList
。也许最好是$.tokenInput.List
。
答案 1 :(得分:0)
(更新:将问题误解为关于tokenInput()
而不是TokenList()
;替换为相关答案。)
jQuery对象(window.jQuery
,$
)有两个语义用途:
该插件的作者似乎希望TokenList()
功能在全球范围内可用;但是,由于它与操纵或引用DOM元素无关,因此将它放入其中是没有意义的,例如$.fn
,就像tokenInput()
一样。但是他仍然希望将它保存在jQuery的命名空间中。
这就是jQuery插件的编写方式;一切都附加到jQuery对象。如果不出意外,这会将函数保留在jQuery名称空间中,这样就不太可能在另一个插件或函数上进行践踏。这不是这个插件的独特之处。我已经看到很多将额外的数学函数,字符串操作方法等直接添加到jQuery对象本身。