2014-02-24 77 views
2

注意:我不確定這是屬於這裏還是Programmers,但我有點害怕他們會將它移到StackOverflow,因爲JavaScript。Javascript插件模式:可擴展還是關閉?

我搞清楚了我正在寫的插件使用什麼模式。當我在查看其他插件時,最常見的插件是相當流行的(我在本例中使用了Underscore.js的_.extend方法)。我不喜歡它的地方是,我需要在任何地方都使用this,我認爲這可能會損害縮小並使我的代碼難以閱讀。另一方面,它很容易擴展。

var App = function(options) { 
    this.initialize(options); 
}; 

_.extend(App.prototype, { 
    initialize: function(options) { 
     this.options = options || {}; 
     this.doStuff(); 
    }, 
    doStuff: function() { 
     if (this.options.talk) { 
      return "Doing stuff."; 
     }    
    } 
}); 

var myApp = new App(); 
myApp.hasOptions = function() { return !!this.options; }; // will return false 

另一種方法是使用閉包。最大的好處是代碼很容易閱讀,而且沒有一個是暴露的(方法或多或少是私有的)。這個問題雖然是不可擴展的。

var App = function(options) { 
    options = options || {}; 

    function initialize() { 
     doStuff(); 
    }; 

    function doStuff() { 
     if (options.talk) { 
      return "Doing stuff."; 
     } 
    }; 

    initialize(); 
}; 

var myApp = new App(); 
myApp.hasOptions = function() { return !!options; }; // will throw a ReferenceError 

我不認爲我的插件需要擴展性;它是/ html輸出插件中的文本。我可以添加對一些事件回調的支持,以幫助其他開發人員將其與應用程序綁定。

我可以俯視嗎?無論如何,我是否應該繼續使用可擴展代碼,是否會因使用閉包而陷入困境?

+0

@DavidEhrmann謝謝,你爲什麼不改變你的評論到一個答案? – Phortuin

+0

「插件」是什麼意思?它應該插在哪裏?它應該如何使用? – Bergi

+0

@Bergi它將用於基於Web的內容管理系統,以幫助編寫更多可讀文本。最小的實現類似於聲明'var betterText = new BetterText({...});'選項哈希包含一對HTML元素選擇器(textarea用於輸入,div用於輸出)以及可選的markdown支持。 – Phortuin

回答

1

缺乏隱私真的是一種語言,我不會讓它指定你的設計。

這可能熬過gzip壓縮得很好是不值得字節精縮到a = this; a.foo();

戰鬥。大部分開銷是建立TCP連接;一個額外的數據包並不那麼引人注目。閉包對他們來說也有很​​多開銷,並且最終會有不同的代表相同功能的對象。如果您創建一個實例,這不是問題,但它可以開始累加。