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 に答える