Javascript模块模式和模块功能

时间:2014-03-19 18:21:53

标签: javascript design-patterns module

var pagger = new function () {

var _a = 1;
var _b = 2;

function add() {
    return _a + _b;
}
return {
    A: _a,
    B: _b,
    Add: add

        };
};

//return 1
alert(pagger.A);
pagger.A=2; 
pagger.B=2;

//return 2
alert(pagger.A);


//return 3
alert(pagger.Add());

如果我使用这种方式创建对象A和B是私有_a和_b的访问者,但如果我尝试通过A更改属性_a,则函数Add不要将其记入帐户。有没有办法使这项工作?

1 个答案:

答案 0 :(得分:1)

您需要使用getter和setter:

return {
    getA: function(){ return _a },
    setA: function(x){ _a = x },
    //...
}

实际上,.A字段不像其他OO语言那样是私有变量的继承者。它只是一个哈希表字段,最初指向当前存储的_a。如果您之后改变_a.A,则不会干扰另一个。


更简单的替代方法是将这些字段公开,而不是包含一些内部变量:

function make_pager(){
   return {
       A : 1,
       B : 2,
       Add: function(){
           //use the dynamically scoped "this" instead 
           //of lexical variables
           return this.A + this.B
       }
   }
}

var pager = make_pager();

pager.A = 10;
console.log(pager.Add());