【问题标题】:Emulating private methods with closures vs public methods in objects用闭包模拟私有方法与对象中的公共方法
【发布时间】:2014-05-28 15:47:17
【问题描述】:

MDN states 闭包用于模拟 模块模式的私有方法

var counter = (function () {
    var privateCounter = 0;

    function changeBy(val) {
        privateCounter += val;
    }

    return {
        increment: function () {
            changeBy(1);
        },
        decrement: function() {
            changeBy(-1);
        }
    };
}());

但是,我们也可以创建一个类来代替使用模块模式。创建类比使用模块模式有什么优势?

function Counter() {
    var privateCounter = 0;

    function changeBy(val) {
        privateCounter += val;
    }

    this.increment = function() {
        changeBy(1);
    };

    this.decrement = function() {
        changeBy(-1);
    };
}

var counter = new Counter();

【问题讨论】:

  • 您在这里仍然使用闭包来保护隐私。只有你创建了一个构造函数,而不是一个单例模块。它更像是下面介绍的makeCounter 函数。
  • @Bergi,感谢您澄清这一点

标签: javascript oop closures private


【解决方案1】:

创建类比使用模块模式有什么优势?

与使用模块模式相比,创建类的优势在于您可以创建一个类的多个实例:

var counter1 = new Counter;
var counter2 = new Counter;

每个实例都有自己的一组私有变量。

另一方面,当您使用模块模式时,您只创建一个对象(通常称为单例、命名空间或模块)。同样,它有自己的一组私有变量。

模块模式和类都有自己的用途。模块模式对于创建模块、管理器对象(其中只有一个实例必须存在)等很有用。

类模式对于创建相同类型的新数据结构很有用。例如,链表数据结构将被建模为类,而不是单例或模块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-14
    • 2015-02-24
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    相关资源
    最近更新 更多