2016-12-29 418 views
0

比方说,我有JavaScript类。javascript用自定义事件创建自定义类

function myClass(){ 

    function someProcess(){ 
     listeners.init(); 
    } 

    var listeners = { 
     init: function(){}, 
     message: function(){} 
    } 

    return { 
     on: function(prop) { 
      if (listeners.hasOwnProperty(prop)) { 
       return listeners[ prop ]; 
      } 
     } 
    } 

} 

然后有人像这样创建对象,并使用我的自定义事件

var c = new myClass(); 
c.on('init', function(){ 
    console.log('init executed'); 
}); 

现在我想从我的someProcess()方法(这是在MyClass的)执行初始化。 所以想法是注册自定义事件,然后从我的课堂里触发它们。

+0

听起来像是你正在寻找的是什么https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent – Noino

回答

1

我发现如何做到这一点

function MyClass(){ 

    //@private 
    var isFunction = function(functionToCheck){ 
     var getType = {}; 
     return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; 
    } 



    //@private 
    var listeners = { 
     init: [], 
     message: [] 
    } 





    return { 
     on: function(evName, callback) { 
      if (listeners.hasOwnProperty(evName) && isFunction(callback)) { 
       listeners[evName].push(callback); 
      } 
     }, 
     fireEvent: function(evName){ 
      if (listeners.hasOwnProperty(evName)) { 
       for(var i in listeners[evName]){ 
        listeners[evName][i](); 
       } 
      } 
     } 
    } 



} 



var a = new MyClass(); 
a.on('init', function(a){ 
    console.log('a_1 inited') 
}) 

a.on('init', function(){ 
    console.log('a_2 inited') 
}) 



var b = new MyClass(); 
b.on('init', function(){ 
    console.log('b_1 inited') 
}) 

a.fireEvent('init'); 
b.fireEvent('init');