Шаблон модуля JavaScript: как частные методы получают доступ к области видимости модуля? - PullRequest
13 голосов
/ 20 декабря 2011

Как при реализации шаблона модуля частные функции получают доступ к закрытым свойствам модуля?Я не видел примеров, когда разработчики делают это.Есть ли причина не делать этого?

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 ]

11 голосов
/ 20 декабря 2011

При реализации шаблона модуля, как частные функции получают доступ к закрытым свойствам модуля?

Свойства находятся в области видимости, поэтому они "просто делают"

Не работает.

Да, это так.

_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
3 голосов
/ 29 октября 2013

Одной из альтернатив для использования частных методов с доступом к this является использование методов call или apply.

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 вне конструктора, если вы планируете иметь несколько экземпляров этого объекта.

...