为什么用jQuery的$内部细节作为前缀?

时间:2013-09-10 17:13:47

标签: javascript jquery-plugins

深入研究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, {...});

2 个答案:

答案 0 :(得分:1)

  

为什么内部的“workhorse”对象以jquery的$为前缀(即为什么要将它添加到jquery的命名空间中)?

因为它比全局命名空间更适合。这是一个 jQuery 插件在没有jQuery的情况下不起作用,所以这是合理的,避免了全局范围的污染。

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

在jQuery名称空间中放置插件的“静态”部分(公共类,全局配置对象,辅助函数等)是common practise,就像使用“本机”jQuery一样函数(utilities或构造函数,如EventDeferred等)。但是,最好将静态属性命名为原型方法,因此TokenInput而不是TokenList。也许最好是$.tokenInput.List

答案 1 :(得分:0)

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

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

  1. 用作函数选择DOM元素以供参考或操作
  2. 命名其全局可用成员,以防止他们干扰其他代码
  3. 该插件的作者似乎希望TokenList()功能在全球范围内可用;但是,由于它与操纵或引用DOM元素无关,因此将它放入其中是没有意义的,例如$.fn,就像tokenInput()一样。但是他仍然希望将它保存在jQuery的命名空间中。

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