javascript无法设置私有变量

时间:2015-06-24 09:14:36

标签: javascript class

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

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}。有谁知道发生了什么?感谢。

2 个答案:

答案 0 :(得分:6)

由于您的“课程”不是单身sinan(),每次a.sss等于1时都会构建新实例。

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

var s = sinan();
console.log( s.get() );
s.set(2); 
console.log( s.get() );

当然,如果你愿意,你也可以制作sinon单身人士。例如,这是一个简单的实现,实例存储在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()每次都返回相同的对象。

演示:http://jsfiddle.net/r07wgyjt/

答案 1 :(得分:1)

您的问题是,每次调用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