Javascript插件模式:可扩展或关闭?

时间:2014-02-24 17:35:50

标签: javascript

注意:我不确定这是属于这里还是属于Programmers,但我有点害怕因为JavaScript而无论如何都会将它移到StackOverflow。

我正在弄清楚我正在编写的插件使用什么模式。当我在看其他插件时,最上面的插件相当受欢迎(我在本例中使用了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 out插件中的文本。我可以添加对几个事件回调的支持,以帮助其他开发人员将其与应用程序联系起来。

我忽略了什么吗?无论如何我应该使用可扩展代码,使用闭包会遇到麻烦吗?

1 个答案:

答案 0 :(得分:1)

缺乏私密性确实是一种语言,我不会让它决定你的设计。

这可能会缩小为a = this; a.foo();

战斗gzip非常好的字节是不值得的。大部分开销是建立TCP连接;额外的数据包并不那么引人注目。闭包对它们来说也有很​​多开销,最终你会得到代表相同功能的不同对象。如果您正在创建一个实例,这不是问题,但它可以开始加起来。