JavaScript模块模式:私有方法如何访问模块的范围?

时间:2011-12-20 18:05:15

标签: javascript module-pattern

实现模块模式时,私有函数如何访问模块的私有属性?我还没有看到任何开发人员这样做的例子。有什么理由不去吗?

var module = (function(){
    // private property
    var number = 0;

    // private method
    _privateIncrement = function(){
        // how do I access private properties here?
        number++;
    };

    // public api
    return {
        // OK
        getNumber: function(){
             return number;   
        },
        // OK
        incrNumber: function(){
             number++;  
        },
        // Doesn't work. _privateIncrement doesn't have
        // access to the module's scope.
        privateIncrNumber: function(){
            _privateIncrement();
        }
    };
})();

2 个答案:

答案 0 :(得分:11)

  

实现模块模式时,私有函数如何访问模块的私有属性?

属性在范围内,所以他们“只做”

  

不起作用。

是的,确实如此。

  

_privateIncrement无法访问模块的范围。

是的,确实如此。

请参阅以下live example

var module = (function(){
    // private property
    var number = 0;

    // global method
    _privateIncrement = function(){
        number++;
    };

    // public api
    return {
        // OK
        getNumber: function(){
             return number;   
        },
        // OK
        incrNumber: function(){
             number++;  
        },
        // Does work!
        privateIncrNumber: function(){
            _privateIncrement();
        }
    };
})();

// Show default value
document.body.innerHTML += (module.getNumber());
// Increment
module.privateIncrNumber();
// Show new value
document.body.innerHTML += (module.getNumber());
// Increment (since _privateIncrement was defined as a global!)
_privateIncrement();
// Show new value
document.body.innerHTML += (module.getNumber());

// Output: 012

答案 1 :(得分:3)

使用私有方法访问this的一种替代方法是使用callapply方法。

function Restaurant()
{
    this.mongoose = 'beans';
    this.freedom = {bear:'love',a:'12'};

    var myPrivateVar;

    var private_stuff = function()   // Only visible inside Restaurant()
    {
        myPrivateVar = "I can set this here!";
        this.mongoose = 12;
    }

    this.use_restroom = function()   // use_restroom is visible to all
    {
        private_stuff();
    }

    this.buy_food = function()    // buy_food is visible to all
    {
        private_stuff();
    }

    private_stuff.call(this);
}

var bobbys = new Restaurant();

当然,如果你计划拥有这个对象的多个实例,你可以将use_restroom和buy_food移动到构造函数之外的prototype和private_stuff。