Как достучаться до функции внутри объекта?

master_x

Pitavale XXI wieku
Как достучаться до функции внутри объекта?

Есть javascript:

PHP:
function Hello()
{
    var Name='nobody';
    
    this.setName=function(name){
         Name=name;
    }
    
    this.hello_init=function(){
         this.setName('Pitaval');
         alert('Hello '+Name);    
    }
}

var msg=new Hello();
window.onload=msg.hello_init;
код расписал для того, чтобы понятно было :)
Вопрос: код как вы сами уже догадались не рабочий ;) А все дело в this.setName('Pitaval'). Так вот каким образом обратиться к методу класса, если this занят, т.е. указывает на объект, который вызвал событие?
Пока отделался добавив внутри Hello переменную Nspace=this;
Теперь вызов setName выглядит так: Nspace.setName('Pitaval'). Чую, что не правильно... Буду рад комментариям.
 

Nirva

Dmitry Polyakov
код станет работоспособным, если ты добавишь msg.hello_init "()" ;)

вообще так, как ты написал реализуются закрытые члены в js, с чем тебя и поздравляю.
если хочешь обращаться к Name вне кода класса - замени var Name на this.Name.
 

master_x

Pitavale XXI wieku
Nirva
к членам класса я хочу обращаться в одном из методов класса. Не за его пределами. А насчет скобок, так ведь мы на событие вешаем указатель на функцию?

Вопрос остался прежним.
 

Nirva

Dmitry Polyakov
объясню. ты немного заблуждаешься в логике.
если на событии в качестве обработчика висит ссылка (т.н. reference call) функция и должна быть обработчиком события, вне всякого объекта. проще говоря согласно логике твой код должен бы был выглядеть как
Код:
...
function  init() {
    msg = new Hello();
    msg.hello_init();
}

window.onload = init;
в твоем же случае более логичней делать именно вызов
Код:
window.onload = msg.init()
если для тебя такая логика остается неочевидной, использование внутренней ссылки (Nspace) совершенно правильно.
 

Nirva

Dmitry Polyakov
конечно будет. код выполнится точно так же, как если бы он был вне события.
 

master_x

Pitavale XXI wieku
Тогда буду смотреть в эту сторону, спасибо за помощь и объяснения.
 

Profic

just Profic (PHP5 BetaTeam)
Как вариант:
PHP:
function Hello() 
{ 
    var Name='nobody'; 
     
    this.setName=function(name){ 
         Name=name; 
    } 
     
    this.hello_init=function(){ 
         this.setName('Pitaval'); 
         alert('Hello '+Name);     
    } 

    this.hello_init_handler=function(handler){
        var this_ = this;
        return function () {this_.hello_init};
    }
} 

var msg=new Hello(); 
window.onload = msg.hello_init_handler();
PS. Как мне кажется,
PHP:
window.onload = msg.init()
можно спокойно сократить до
PHP:
msg.init()
:)
 
Сверху