2014-12-07 20 views
0

我有下面的代码:如何创建和Singleton类中的事件处理程序 - 的Javascript

// Singleton 
var mySingleton = (function() { 
    // Private methods and variables 

    function privateMethod(){ 
     console.log("I am private"); 
    } 

    var privateVariable = "Im also private"; 

    return { 
     // Public methods and variables 
     hello: function() { 
     console.log("I want to ''fire'' the event 'hello'"); 
     } 
    }; 
})(); 

而且我要创造我自己的事件处理系统。我试着用下面的代码:

var mySingleton = (function() { 

    function privateMethod(){ 
     console.log("I am private"); 
    } 

    var handlers = {}; 
    mySingleton.prototype.registerHandler = function(event, callback) { 
     this.handlers[event] = callback; 
    }; 
    mySingleton.prototype.fire = function(event) { 
     this.handlers[event](); 
    }; 

    var privateVariable = "Im also private"; 

    return { 
     hello: function() { 
     console.log("I want to ''fire'' the event 'hello'"); 
     fire('hello'); 
     } 
    }; 

})(); 

我使用方法如下:

mySingleton .registerHandler('hello', function() { 
    alert('Hi!'); 
}); 

但是,这并不工作...我扔了一个错误:

Cannot read property 'prototype' of undefined 

有人可以帮我吗?

我目前的错误:

Uncaught TypeError: Cannot set property 'mycustomevent' of undefined 
Uncaught TypeError: Cannot read property 'mycustomevent' of undefined 

回答

1

你的代码是试图使分配到一个对象,尚不存在的“原型”属性。反正真的没有意义;只是把对象中的这些方法你返回:

var mySingleton = (function() { 

    function privateMethod(){ 
     console.log("I am private"); 
    } 

    var handlers = {}; 
    var privateVariable = "Im also private"; 

    return { 
     hello: function() { 
     console.log("I want to ''fire'' the event 'hello'"); 
     this.fire('hello'); 
     }, 
     registerHandler: function(event, callback) { 
     handlers[event] = callback; 
     }, 
     fire: function(event) { 
     if(handlers[event]){ 
      handlers[event](); 
     }else{ 
      console.error("Sorry, there aren't any handlers registered with that name"); 
     } 
     } 
    }; 
})(); 

你正在构建的“mySingleton”只是一个普通的对象的对象;也就是说,它是Object构造函数的一个实例。没有涉及新的原型。

你并不需要一个this引用来访问“处理程序”地图,因为它是在事件处理函数关闭范围。代码被安排的方式,然而,确实使用.fire() API时需要this,尽管这可以通过具有服务功能的匿名包装必须在本地声明被固定了。

+0

您好,感谢您的校正。但是...当我尝试使用它: mySingleton .registerHandler( 'mycustomevent',函数(){ ... }); 和mySingleton.fire('mycustomevent'); 扔我的下一个错误: 遗漏的类型错误:无法设置未定义 遗漏的类型错误的特性“mycustomevent”:无法读取的不确定 财产“mycustomevent”愿你能帮助我,好吗? – MartaGom 2014-12-07 16:22:53

+1

¡对不起!我忘了删除“这个”参考。它工作太棒了。非常感谢:) – MartaGom 2014-12-07 16:37:56

+0

@MartaFernandez好吧,我很高兴它为你工作! – Pointy 2014-12-07 16:48:49

0

试试下面的代码

var singleton = (function(){ 
 
    var instance; 
 
    var myObj = function(){ 
 
     this.name = "myObj"; 
 
     this.eventObj = {}; 
 
    }; 
 
    var localFn = function(){ 
 
     if(!instance){ 
 
      instance = new myObj();//singleton, instance created once 
 
     } 
 
     return instance; 
 
    }; 
 
    //add 2 functions on myObj 
 
    myObj.prototype.addEvent = function(evName, cb){ 
 
     this.eventObj[evName] = cb; 
 
    }; 
 
    myObj.prototype.invokeEvent= function(evName){ 
 
     this.eventObj[evName](); 
 
    }; 
 
    return localFn; 
 
}()); 
 

 
singleton().addEvent("btnClick", function(){alert("click event invoked")}); 
 
singleton().addEvent("btnClick_1", function(){alert("click event invoked")}); 
 
singleton().invokeEvent("btnClick"); //alert "click event invoked"

相关问题