2014-12-07 35 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"

相關問題