我一直在寻找使用构造函数模块模式访问私有属性的方法。我想出了一个有效的解决方案,但我不确定这是最优的。
mynamespace.test = function () {
var s = null;
// constructor function.
var Constr = function () {
//this.s = null;
};
Constr.prototype.get = function () {
return s;
};
Constr.prototype.set = function (s_arg) {
s = s_arg;
};
// return the constructor.
return new Constr;
};
var x1 = new mynamespace.test();
var x2 = new mynamespace.test();
x1.set('x1');
alert('x1 get:' + x1.get()); // returns x1
x2.set('x2');
alert('x2 get:' + x2.get()); // returns x2
alert('x1 get: ' + x1.get()); // returns x1
答案 0 :(得分:0)
mynamespace.Woman = function(name, age) {
this.name = name;
this.getAge = function() {
// you shouldn't ask a woman's age...
return age;
};
this.setAge = function(value) {
age = value;
};
};
var x1 = new mynamespace.Woman("Anna", 30);
x1.setAge(31);
alert(x1.name); // Anna
alert(x1.age); // undefined
alert(x1.getAge()); // 31
此解决方案与您的解决方案之间的区别在于,每次调用namespace.test()时,您的解决方案都会生成一个新的Constr。这是一个微妙的差异,但这仍然是首选。
其中一个不同之处在于您可以使用:
x1 instanceof mynamespace.Woman
在您的解决方案中,x1的类型与x2不同,因为它们使用不同的Constr。