2013-09-18 2 views
1

Я пытаюсь создать собственный класс EventManager javascript и добавить некоторые функции обратного вызова. Но когда вызывается функция обратного вызова, «этот» объект в функции не определен. Я посмотрел Custom Javascript EventManager - please help me complete, но это не отвечает на мои вопросы полностью.Event manager - это не определено в функции обратного вызова

Почему это и this.name undefined в this.onEvent? Пожалуйста, помогите, спасибо.

Вот мой jsfiddle: http://jsfiddle.net/Charissima/fswfv/3/

function arEventManager() { 

    this.callbacks = {};    

    this.addCallback = function(eventCategory, fn) { 
     if (!this.callbacks[eventCategory]) { 
      this.callbacks[eventCategory] = []; 
     } 
     if (fn instanceof Function) { 
      this.callbacks[eventCategory].push(fn); 
     } 
     return this; 
    }, // addCallback 

    this.dispatchEvent = function(eventCategory, params) { 
     // Callback-Funktion(en) ausloesen 
     for (var iC = 0, lC = this.callbacks[eventCategory].length; iC < lC; iC++) { 
      console.log(this.callbacks[eventCategory][iC]); 
      this.callbacks[eventCategory][iC](params); 
     } 
    } // dispatchEvent    
}; 

function arPerson() { 
    this.name; 
    this.setName = function(name) { 
     this.name = name; 
    }, 
    this.getName = function() { 
     return (this.name); 
    }, 
    this.onEvent = function(p2) { 
     alert('this.name = ' + this.name + '/' + 'p2.name = ' + p2.name); 

    } 
}; 


var eventManager = new arEventManager; 

var Thomas = new arPerson();  
Thomas.setName('Thomas'); 

var Mike = new arPerson(); 
Mike.setName('Mike'); 

eventManager.addCallback("myEvent", Mike.onEvent); 

function test() { 
    eventManager.dispatchEvent('myEvent', Thomas); 
} 
+0

Новая функция создает новую область, с другой 'this'. – adeneo

ответ

0

Сделать имя переменной частной?

Мусор (arPerson)

function arPerson() { 
    var name; 
    this.setName = function(nm) { 
     name = nm; 
    }, 
    this.getName = function() { 
    return (name); 
    }, 
    this.onEvent = function(p2) { 
     alert('this.name = ' + name + '/' + 'p2.name = ' + p2.getName()); 
    } 
}; 
1

Это происходит потому, что вы не используете call или apply при вызове функции, и вы называете это без контекста. Например:

  • x.func() называет x.func таким образом, что внутри функции this относится к x.

  • var func = x.func; func(); звонки x.func без указания цены для this.

  • x.func.call(y); называет x.func таким образом, что внутри функции this относится к y.

Вы можете связать контекст функции с помощью bind, что вам нужно Shim для совместимости браузера:

eventManager.addCallback("myEvent", Mike.onEvent.bind(Mike)); 

Updated JSFiddle

Смежные вопросы