javascript无法设置私有变量

javascript无法设置私有变量,javascript,class,Javascript,Class,我创建了一个带有私有变量的类结构。代码如下:     var sinan = function(){ var a = {ssss: 1}; return { get: function(){ return a; }, set: function(s){ a = {ssss: s} } } } 当我这样做的时候 sinan().get(); // outputs

我创建了一个带有私有变量的类结构。代码如下:    

var sinan = function(){
    var a = {ssss: 1};
    return {
        get: function(){
            return a;
        },
        set: function(s){
            a = {ssss: s}
        }
    }
}
当我这样做的时候

sinan().get(); // outputs {ssss: 1}
sinan().set(2); 
sinan().get(); // outputs {ssss: 1}
它没有输出
{ssss:2}
。有人知道发生了什么吗?谢谢。

因为您的“类”不是单例
sinan()
每次都构造新实例,而
a.sss
等于
1

您要做的是只创建一个实例并使用它:

var s = sinan();
console.log( s.get() );
s.set(2); 
console.log( s.get() );
当然,如果您愿意,也可以制作
sinon
singleton。例如,下面是一个实例存储在closure中的简单实现:

var sinan = function () {

    var instance;

    return function () {
        if (!instance) {
            instance = function() {
                var a = {ssss: 1};
                return {
                    get: function () {
                        return a;
                    },
                    set: function (s) {
                        a.ssss = s
                    }
                }
            }();
        }
        return instance;
    };
}();
因此,在本例中,
sinan()===sinan()
,即,
sinan()
每次都返回相同的对象


演示:

您的问题是,每次调用
sinan()
,都会创建一个新的sinan实例,因此它与:

var s1 = sinan();
s1.get(); // 1
var s2 = sinan() ;
s2.set(2); // 2
var s3 = sinan();
s3.get(); // 3
你应该做:

var s1 = sinan();
s1.get(); // 1
s1.set(2); // 2
s1.get(); // 2

sinan()。也许您想要一个静态类+1用于指出单例函数:很好。如果您将所有函数详细信息放在return之外,并在return中使用函数名初始化实例,则会更好。类似这样的东西。==>知道了!谢谢你解释单身汉的案子。