2

我一直在寻找一种使用构造函数模块模式访问私有属性的方法。我想出了一个可行的解决方案,但不确定这是最佳的。

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
4

1 回答 1

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() 时都会生成一个新的 Consr。这是一个微妙的区别,但这仍然是首选。

区别之一是您可以使用:

x1 instanceof mynamespace.Woman

而在您的解决方案中,x1 的类型与 x2 不同,因为它们使用不同的 Consr。

于 2013-01-06T16:15:47.793 回答