13

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

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();
        }
    };
})();
4

2 回答 2

13

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

属性在范围内,因此它们“只是做”

不工作。

是的,它确实。

_privateIncrement无权访问模块的范围。

是的,它确实。

请参阅以下内容的实时示例

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
于 2011-12-20T18:11:09.137 回答
3

拥有可以访问 的私有方法的一种替代方法this是使用callorapply方法。

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 移动到构造函数之外的原型和 private_stuff。

于 2013-10-29T18:43:40.063 回答