Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проблема с приватными методами. (https://javascript.ru/forum/misc/36927-problema-s-privatnymi-metodami.html)

H1ghlander 01.04.2013 15:25

Проблема с приватными методами.
 
Для реализации приватных методов в JS я использую такую конструкцию. И все было бы хорошо, но есть одна проблема, функция _getName выполняется раньше чем выполнятся конструктор, отсюда она ничего не знает о свойстве this.name. Как можно поступить в такой ситуации для решения данного вопроса?

Animal = function(name)
{
    this.name = name;
};

Animal.prototype = function()
{
    function _getName()
    {
         console.log(this.name);
    }
    return {
        getName: function()
        {
            console.log(this.name);
        }
    };
}();

rgl 01.04.2013 16:03

В приведенном примере функция _getName вообще не выполняется, ни раньше ни позже, и не может быть вызвана, т.к. она видна только внутри конструктора, в котором она не вызывается.

H1ghlander 01.04.2013 16:11

Функция _getName может быть вызвана например в функции getName - это и есть приватный метод.

ksa 01.04.2013 16:28

Как тогда понять это
Цитата:

Сообщение от H1ghlander
функция _getName выполняется раньше чем выполнятся конструктор

?

Т.е. примера-то и нет... :no:

rgl 01.04.2013 16:36

Цитата:

Сообщение от H1ghlander (Сообщение 243702)
Функция _getName может быть вызвана например в функции getName - это и есть приватный метод.

Если ее вызвать по-простому, то она работать не будет т.к. this будет указывать не туда. Но можно вызвать так:
Animal = function(name)
{
    this.name = name;
};

Animal.prototype = function()
{
    function _getName()
    {
         console.log(this.name);
    }
    return {
        getName: function()
        {
            _getName.call(this);
        }
    };
}();


var a = new Animal("Murzik");
a.getName();

H1ghlander 01.04.2013 21:03

rgl,
Спасибо, это решает одну проблему, но бывает еще необходимо делать примерно следующее var _name = this.name; в прототипе вне функции.
Animal = function(name)
{
    this.name = name;
};
 
Animal.prototype = function()
{
    var _name = this.name;
    function _getName()
    {
         console.log(this.name);
    }
    return {
        getName: function()
        {
            console.log(this.name);
        }
    };
}();

danik.js 01.04.2013 21:22

H1ghlander, и на что в твоем примере должен this указывать? Инстанса ведь еще нет на момент выполнения твоей функции, создающей прототип.

H1ghlander 01.04.2013 21:25

я это понимаю, поэтому и спрашиваю как можно разрешить данную ситуацию.

SV0L0CH 01.04.2013 21:30

Там разве что через функцию можно такой доступ сделать
var _name = function(obj){obj.name;}
//обращаться так
_name(this);

megaupload 01.04.2013 22:39

Цитата:

Сообщение от H1ghlander
я это понимаю, поэтому и спрашиваю как можно разрешить данную ситуацию.

ЗАЧЕМ тебе вызывать МЕТОД ИНСТАНСА до СОЗДАНИЯ ИНСТАНСА?


Часовой пояс GMT +3, время: 08:31.