Javascript 在对象中使用闭包和公共方法模拟私有方法

Javascript 在对象中使用闭包和公共方法模拟私有方法,javascript,oop,closures,private,Javascript,Oop,Closures,Private,由于闭包用于模拟模块模式的私有方法: 但是,我们也可以创建一个类,而不是使用模块模式。与使用模块模式相比,创建类的优势是什么 function Counter() { var privateCounter = 0; function changeBy(val) { privateCounter += val; } this.increment = function() { changeBy(1); }; thi

由于闭包用于模拟模块模式的私有方法:

但是,我们也可以创建一个类,而不是使用模块模式。与使用模块模式相比,创建类的优势是什么

function Counter() {
    var privateCounter = 0;

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

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

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

var counter = new Counter();
与使用模块模式相比,创建类的优势是什么

function Counter() {
    var privateCounter = 0;

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

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

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

var counter = new Counter();
与使用模块模式相比,创建类的优势在于可以创建一个类的多个实例:

var counter1 = new Counter;
var counter2 = new Counter;
每个实例都有自己的私有变量集

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

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


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

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