日期:2014-05-16  浏览次数:20399 次

怎么实现JS类私有属性?
上代码:

(function(){
function test(){
var data;
}
test.prototype = {
get: function(){
return data;
},
set: function(val){
data = val;
return this;
}
}
window.test = test;
})();


var obj1 = new test();
obj1.set("1234");
console.log(obj1.get());

var obj2 = new test();
console.log(obj2.get())

现在的问题是,两个对象都能访问到data的值。而不是像java,php等属性是绑定在对象上的,现在这里的这种情况就有点像data是类静态属性或常量。
------解决方案--------------------
(function(){
    function test(){
        var data;
        var self = this;
        this.get = function() {
            return data;
        }
        this.set = function(val) {
            data = val;
            return self;
        }
    }
    window.test = test;
})();

var obj1 = new test();
obj1.set("1234");
console.log(obj1.get());
 
var obj2 = new test();
console.log(obj2.get())

------解决方案--------------------
用prototype太麻烦了, 难以模拟private访问修饰
这样方便 

(function(){
    function test(){
        var data;

this.get = function() {
return data;
}

this.set = function( val ) {
data = val;
return this;
}
    }
    window.test = test;
})();

------解决方案--------------------
LZ的代码有问题好不好,demo成功了只是因为先调用了set再调用get而已!
这也是两个实例共用了一个data的原因啊,像静态的一样是吧,因为这个data被set到window上去了!!




(function(){
    function test(){
        var data;  //这个data形同虚设,下面的get/set根本不是用的这货呀!
    }
    test.prototype = {
        get: function(){
            return data;
        },
        set: function(val){
            data = val;  //这个data根本不能引用test内部的data,其实这里是window.data = val;
            return this;
        }
    }
    window.test = test;
})();


要实现你的需求,#1、#7、#8都可以。
------解决方案---------