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

Javascript 为什么用jQuery的$A作为内部细节的前缀?,javascript,jquery-plugins,Javascript,Jquery Plugins,深入研究javascript和插件,我将查看一些现有代码——jQuery的TokenInput插件 这确实是一个更一般的问题-为什么内部workhorse对象标记列表前缀为jquery的$,即为什么要将其添加到jquery的名称空间 下面是一个相关的例子: // Expose the .tokenInput function to jQuery as a plugin $.fn.tokenInput = function(method) { ... this is th

深入研究javascript和插件,我将查看一些现有代码——jQuery的TokenInput插件

这确实是一个更一般的问题-为什么内部workhorse对象标记列表前缀为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而不是TokenList;替换为相关的答案

jQuery对象窗口.jQuery$有两个语义用途:

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

这就是jQuery插件的编写方式;所有内容都附加到jQuery对象。如果没有其他内容,这会将函数保留在jQuery名称空间中,这样就不太可能破坏其他插件或函数。这不是这个插件独有的。我见过很多直接向jQuery对象本身添加额外的数学函数、字符串操作方法等

为什么内部workhorse对象的前缀是jquery的$,即为什么要将其添加到jquery的命名空间中

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

也可以将构造函数隐藏在闭包中,只导出$.fn.tokenInput方法,但通过公开它,可以扩展该类


将插件公共类、全局配置对象、助手函数和类似的静态部分放在jQuery命名空间上是一种很好的方法,就像本地jQuery函数或构造函数一样。但是,将静态属性命名为与原型方法相同是一种很好的做法,所以这里是TokenInput而不是TokenList。也许最好是$.tokenInput.List。

我认为问题是关于$.TokenList=而不是$.fn行。我想我共享了多少代码还不清楚,但TokenList实际上都是专用于实现的逻辑。我没有看到任何扩展点或独立值-我将再次查看。但是,如果为了学习,我们假设它都是私有逻辑,那么将函数保持为插件私有不是更有意义吗?作者是如何实现这种js语法的
$(element).tokenInput(svcUrl, {...});