2012-06-29 72 views
3

我目前正在研究一個很大的插件,我想知道如果這種模式添加公共方法有任何缺點,如果是的話是什麼?這個jQuery插件模式添加公共方法的缺點

編輯:爲了澄清,用這種方法,我可以看到的好處是,你可以使用任何可用的私有變量在插件的範圍,你可以很容易鏈中的方法。我看不到什麼缺點?它一直在正常工作,但我不確定在可伸縮性方面是否推薦使用大插件。

這裏的簡化代碼:

;(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() 

回答

2

是的,它有缺點。

  1. 你污染了jQuery內部命名空間所有publicMethods的。這意味着one(),two()three()也可以在其他jQuery對象上調用 - 在您調用.myplugin()之後 - 這可能會導致意外的結果?

  2. 它以高度不可維護的方式保持您的代碼以這種奇怪的方式構造 - 一個函數內部的對象。爲什麼不把你的publicMethods添加到$.fn,因爲它基本上是你想要實現的目標?

我勸使one()two()three()只有內部myplugin()範圍訪問,這樣就可以做的東西一樣$('#foo').myplugin().one()但不$('#foo').one()

+0

但它真的會產生衝突嗎?我做了一個快速小提琴http://jsfiddle.net/elclanrs/jw6x2/。你會如何改變它?你能提供一個例子嗎? – elclanrs

+0

我已經做了一些更多的測試,看起來你的第一點並沒有發生。我更新了小提琴。第二點是有爭議的,你認爲爲什麼不可維護? – elclanrs

+0

假設OP的插件更多,以這種方式暴露公共方法可能是有意義的,但方法名必須是唯一的,否則它可能與另一個具有相同命名方法的插件衝突。命名空間'時,請參閱[這個線程](http://stackoverflow.com/questions/1219635/jquery-plugin-namespacing-functions) – PHearst