这个jQuery插件模式添加公共方法的缺点

3
我目前在开发一个相当大的插件,我想知道这种添加公共方法的模式是否有任何缺点,如果有,那么是什么? 编辑:澄清一下,使用此方法的优势是可以使用插件范围内可用的任何私有变量,并且可以轻松地链接这些方法。 我看不到哪些是缺点?它一直工作得很好,但我不确定对于可扩展性较大的插件是否推荐使用这种方法。
以下是简化后的代码:
;(function($){

  $.fn.myplugin = function () {

    var self = this

    var publicMethods = {      
      one: function () {
        ...
        return self
      },
      two: function () {
        ...
        return self
      },
      three: function () {
        ...
        return self
      }
    }

    for (var m in publicMethods)
      self[m] = publicMethods[m]

    return self

  }

}(jQuery))

// Usage
var $myplugin = $('#foo').myplugin()
$myplugin.one().two().three()
1个回答

2

是的,它有缺点。

  1. 你正在使用 所有publicMethods 污染了 jQuery 内部命名空间。这意味着在调用 .myplugin() 之后,其他 jQuery 对象也可以调用 one()two()three() —— 这可能会导致意外的结果?

  2. 以这种奇怪的方式构建代码结构非常难以维护 - 函数内的对象。为什么不直接将你的 publicMethods 添加到 $.fn 中,因为基本上这就是你想要实现的功能?

我建议只在 myplugin() 范围内使 one()two()three() 可访问,这样你就可以执行像 $('#foo').myplugin().one() 这样的操作,但不能执行像 $('#foo').one() 这样的操作。


但是它真的会创建冲突吗?我做了一个快速的fiddle http://jsfiddle.net/elclanrs/jw6x2/。你会怎么做呢?你能提供一个例子吗? - elclanrs
我做了更多的测试,似乎你提出的第一个观点并不成立。我更新了代码片段。第二个观点是有争议的,你认为为什么会难以维护? - elclanrs
假设 OP 的插件还有更多功能,以这种方式公开公共方法可能是有意义的,但方法名称必须非常独特,否则可能会与另一个具有相同命名方法的插件发生冲突。命名空间'em,请参见此线程 - PHearst
我同意你的缺点(+1),但你能更好地阐述一下吗? - Dave Alperovich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接