Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.04.2013, 15:25
Новичок на форуме
Отправить личное сообщение для H1ghlander Посмотреть профиль Найти все сообщения от H1ghlander
 
Регистрация: 01.04.2013
Сообщений: 5

Проблема с приватными методами.
Для реализации приватных методов в 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);
        }
    };
}();
Ответить с цитированием
  #2 (permalink)  
Старый 01.04.2013, 16:03
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

В приведенном примере функция _getName вообще не выполняется, ни раньше ни позже, и не может быть вызвана, т.к. она видна только внутри конструктора, в котором она не вызывается.
Ответить с цитированием
  #3 (permalink)  
Старый 01.04.2013, 16:11
Новичок на форуме
Отправить личное сообщение для H1ghlander Посмотреть профиль Найти все сообщения от H1ghlander
 
Регистрация: 01.04.2013
Сообщений: 5

Функция _getName может быть вызвана например в функции getName - это и есть приватный метод.
Ответить с цитированием
  #4 (permalink)  
Старый 01.04.2013, 16:28
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

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

Т.е. примера-то и нет...
Ответить с цитированием
  #5 (permalink)  
Старый 01.04.2013, 16:36
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Сообщение от H1ghlander Посмотреть сообщение
Функция _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();

Последний раз редактировалось rgl, 01.04.2013 в 16:38.
Ответить с цитированием
  #6 (permalink)  
Старый 01.04.2013, 21:03
Новичок на форуме
Отправить личное сообщение для H1ghlander Посмотреть профиль Найти все сообщения от H1ghlander
 
Регистрация: 01.04.2013
Сообщений: 5

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);
        }
    };
}();
Ответить с цитированием
  #7 (permalink)  
Старый 01.04.2013, 21:22
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

H1ghlander, и на что в твоем примере должен this указывать? Инстанса ведь еще нет на момент выполнения твоей функции, создающей прототип.
Ответить с цитированием
  #8 (permalink)  
Старый 01.04.2013, 21:25
Новичок на форуме
Отправить личное сообщение для H1ghlander Посмотреть профиль Найти все сообщения от H1ghlander
 
Регистрация: 01.04.2013
Сообщений: 5

я это понимаю, поэтому и спрашиваю как можно разрешить данную ситуацию.
Ответить с цитированием
  #9 (permalink)  
Старый 01.04.2013, 21:30
Профессор
Отправить личное сообщение для SV0L0CH Посмотреть профиль Найти все сообщения от SV0L0CH
 
Регистрация: 07.11.2010
Сообщений: 301

Там разве что через функцию можно такой доступ сделать
var _name = function(obj){obj.name;}
//обращаться так
_name(this);
Ответить с цитированием
  #10 (permalink)  
Старый 01.04.2013, 22:39
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Сообщение от H1ghlander
я это понимаю, поэтому и спрашиваю как можно разрешить данную ситуацию.
ЗАЧЕМ тебе вызывать МЕТОД ИНСТАНСА до СОЗДАНИЯ ИНСТАНСА?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с обработкой ескольких .hover() anocean jQuery 3 15.06.2012 22:43
Проблема с Popup окном vovuslik jQuery 5 12.06.2010 16:12
Проблема с дизайном после отправки xmlhttprequest, Проблема с дизайном после отправки cyberx AJAX и COMET 3 01.05.2010 17:07
Проблема с CSS COKOJIOB (X)HTML/CSS 5 04.08.2009 14:19
Проблема спама lliberty AJAX и COMET 1 12.03.2009 16:47