0

我有下一个代码:

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

2 回答 2

2

您的代码正在尝试对尚不存在的对象的“原型”属性进行分配。反正真的没有意义;只需将这些方法放在您要返回的对象中:

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引用来访问“处理程序”映射,因为它在事件处理函数的闭包范围内。然而,代码的排列方式在使用 API 时确实需要,尽管这也可以通过在匿名包装器中本地声明服务函数来解决。this.fire()

于 2014-12-07T14:53:11.993 回答
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"

于 2016-11-22T01:21:05.390 回答