0

一般来说,深入研究 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, {...});
4

2 回答 2

1

为什么内部“主力”对象以 jquery 为前缀$(即为什么将其添加到 jquery 的命名空间)?

因为它比全局命名空间更适合那里。它是一个jQuery插件,没有 jQuery 就无法工作,所以这是合理的,并且避免了全局范围污染。

也可以将构造函数隐藏在闭包中(并仅导出$.fn.tokenInput方法),但是通过将其公开,可以扩展类。

将插件的“静态”部分(公共类、全局配置对象、辅助函数等)放在 jQuery 命名空间中是一种常见的做法,就像使用“原生”jQuery 函数(实用程序或构造函数)一样等EventDeferred。但是,最好将静态属性命名为与原型方法相同的名称,所以TokenInput不要在TokenList这里。也许会更好$.tokenInput.List

于 2013-09-11T14:17:02.520 回答
0

(更新:将问题误解为 abouttokenInput()而不是TokenList(); 替换为相关答案。)

jQuery 对象 ( window.jQuery, $) 有两个语义用途:

  1. 用作函数选择 DOM 元素以进行引用或操作
  2. 为其全局可用成员命名,以防止它们干扰其他代码

插件的作者似乎希望该TokenList()功能在全球范围内可用;但是,由于它与操作或引用 DOM 元素无关,因此将其放入例如$.fn, like tokenInput()is 是没有意义的。但他仍然希望将其保留在 jQuery 的命名空间中。

这就是 jQuery 插件的编写方式;一切都附加到 jQuery 对象。如果不出意外,这会将函数保留在 jQuery 命名空间内,这样就不太可能践踏另一个插件或函数。这不是这个插件独有的。我已经看到很多直接向 jQuery 对象本身添加额外的数学函数、字符串操作方法等。

于 2013-09-11T14:01:19.473 回答