Javascript 插件模式 : extendable or closures?

标签 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

另一种方法是使用闭包。最大的好处是代码易于阅读,而且没有任何内容是公开的(方法或多或少是私有(private)的)。但问题是它不可扩展。

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 输出插件。我可以添加对几个事件回调的支持,以帮助其他开发人员将其与他们的应用程序结合起来。

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

最佳答案

缺少 private 确实是一种语言问题,我不会让它支配您的设计。

这可以缩小到 a = this; a.foo();

争夺 gzip 真正好的字节是不值得的。大部分开销用于建立 TCP 连接;额外的数据包并不那么引人注目。闭包也有很多开销,你最终会得到代表相同功能的不同对象。如果您只创建一个实例,这不是问题,但它可能会开始累加。

关于Javascript 插件模式 : extendable or closures?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21994837/

相关文章:

javascript - Bootstrap 嵌套可折叠面板

javascript - 停止滚动条向左推内容

if语句的Javascript微优化

javascript - 使用 jQuery 隐藏带有 colspan 和 rowspan 的复杂列

javascript - 理解 typescript 生成的 __extends 函数?

javascript - ES6 |更改B类中A类的数据?

javascript - 使用 jQuery 将 <li> 和 </li> 添加到 <ul>

javascript - 如何保护 javascript 变量在发布到服务器时不被操纵?

javascript - 基于onclick事件切换状态

javascript - 谁在 JavaScript 中通过嵌套对象进行映射并删除键值对