如何在Singleton类中创建事件处理程序-Javascript

如何在Singleton类中创建事件处理程序-Javascript,javascript,singleton,custom-events,Javascript,Singleton,Custom Events,我有下一个代码: // Singleton var mySingleton = (function () { // Private methods and variables function privateMethod(){ console.log( "I am private" ); } var privateVariable = "Im also private"; return { // Public methods

我有下一个代码:

// 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

您的代码正在尝试对尚不存在的对象的“prototype”属性进行赋值。无论如何,这真的没有意义;只需将这些方法放在要返回的对象中:

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”只是一个普通对象;也就是说,它是对象构造函数的一个实例。没有新的原型


访问“handlers”映射不需要
这个
引用,因为它在事件处理函数的闭包范围内。但是,在使用
.fire()
API时,代码的排列方式确实需要
,不过,也可以通过在匿名包装器中本地声明服务函数来解决此问题。

尝试下面的代码

var singleton=(函数(){
var实例;
var myObj=函数(){
this.name=“myObj”;
this.eventObj={};
};
var localFn=函数(){
如果(!实例){
instance=new myObj();//单例,实例创建一次
}
返回实例;
};
//在myObj上添加2个函数
myObj.prototype.addEvent=函数(evName,cb){
this.eventObj[evName]=cb;
};
myObj.prototype.invokeEvent=函数(evName){
这个.eventObj[evName]();
};
返回localFn;
}());
singleton().addEvent(“btnClick”,function(){alert(“click事件调用”)});
singleton().addEvent(“btnClick_1”,function(){alert(“click事件调用”)});

singleton().invokeEvent(“btnClick”)//警报“单击调用的事件”
Hi,感谢您的更正。但是当我尝试使用它时:mySingleton.registerHandler('mycustomevent',function(){…});还有mySingleton.fire(“mycustomevent”);抛出下一个错误:未捕获类型错误:无法设置未定义的未捕获类型错误的属性“mycustomevent”:无法读取未定义类型的属性“mycustomevent”。请帮我解决这个问题。对不起!我忘了删除“this”引用。它工作得很好。非常感谢:)@MartaFernandez好的,我很高兴它能为你工作!你认为我应该写代码检查火灾事件是否被登记吗?如果我在出现下一个错误之前在没有调用registerHandler的情况下使用“hello”方法:undefined不是函数(MySingleton.fire)是的,您可以检查并抛出一些有用的异常。这在JavaScript库中并不常见,但我不认为这样做有什么错。我最喜欢的框架通常是那些在可能的情况下提供有用的解释性错误的框架。