2016-05-11 17 views
0

カスタムイベントエミッタを作成しようとしています。以下のようにonemitを置き換えることはできないようです。私はonTestemitTestなど異なる方法onemitを割り当てる試みた EventEmitterを拡張できませんか?

  • (動作しない)他の変数にメソッドを割り当て、それらを使用して試みたが、原稿を削除しました

    • (その動作)

    ここEventEmitterを拡張するクラスです:

    import { EventEmitter } from 'events' 
    
    export default class MyEventEmitter extends EventEmitter { 
        constructor() { 
        super() 
        this._on = this.on 
        this._emit = this.emit 
        delete this.on 
        delete this.emit 
        } 
        on() { 
        this._on.apply(this, Object.values(arguments)) 
        } 
        emit() { 
        this._emit.apply(this, Object.values(arguments)) 
        } 
    } 
    
    let event = new MyEventEmitter() 
    
    event.on('hi',() => console.log('meow')) 
    
    event.emit('hi') 
    
    また、これを試してみましたし、同じエラー受け取っ1

    $ babel-node ./src/event-store/my-event-emitter.js 
    /Users/thomas/.nvm/versions/node/v5.10.0/lib/node_modules/babel-cli/node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.values.js:0 
    
    
    
    RangeError: Maximum call stack size exceeded 
        at Object.propertyIsEnumerable (native) 
        at /Users/thomas/.nvm/versions/node/v5.10.0/lib/node_modules/babel-cli/node_modules/babel-polyfill/node_modules/core-js/modules/_object-to-array.js:12:32 
        at values (/Users/thomas/.nvm/versions/node/v5.10.0/lib/node_modules/babel-cli/node_modules/babel-polyfill/node_modules/core-js/modules/es7.object.values.js:7:12) 
        at MyEventEmitter.emit (my-event-emitter.js:15:28) 
        at MyEventEmitter.emit (my-event-emitter.js:15:16) 
        at MyEventEmitter.emit (my-event-emitter.js:15:16) 
        at MyEventEmitter.emit (my-event-emitter.js:15:16) 
        at MyEventEmitter.emit (my-event-emitter.js:15:16) 
        at MyEventEmitter.emit (my-event-emitter.js:15:16) 
        at MyEventEmitter.emit (my-event-emitter.js:15:16) 
    

    UPDATE:10

    ここでは、スタックだこれらの継承されたメソッドを再定義するに

    import { EventEmitter } from 'events' 
    
    export default class MyEventEmitter extends EventEmitter { 
        constructor() { 
        super() 
        } 
        on() { 
        this.on.apply(this, Object.values(arguments)) 
        } 
        emit() { 
        this.emit.apply(this, Object.values(arguments)) 
        } 
    } 
    
    let event = new MyEventEmitter() 
    
    event.on('hi',() => console.log('meow')) 
    
    event.emit('hi') 
    
  • +0

    「*私は他の変数にメソッドを割り当て、*それらを使用してみました」 - ?**なぜ**だけで実行しませんそれ。 – Bergi

    +0

    "*オリジナルの削除*" - (やはり、なぜ?)プロトタイプメソッドなので、これを行うことはできません。 – Bergi

    +0

    @Bergiは、あなたが 'UPDATE 1 '内のコードブロックに入れた内容を提案していますか? – ThomasReggi

    答えて

    4

    あなたの試みをthis._emit === this.emitになってしまった、そのコールで無限の再帰を生成しました。

    メソッドを上書きする場合は、そのようにする必要があります。他の名前にそれらを再割り当てする必要はなく、インスタンスにもないプロパティを削除しようとする必要はありません。

    export default class MyEventEmitter extends EventEmitter { 
        on(...args) { 
        return super.on(...args) 
        } 
        emit(...args) { 
        return super.emit(...args); 
        } 
    } 
    

    (私はそれらのObject.values呼び出しは無意味だったと仮定)

    +0

    コンストラクタで 'this'プロパティを設定したい場合、私はここで何をしますか?スーパーを呼び出さずにこれを行う方法はありません。 – ThomasReggi

    +0

    @ThomasReggi:もちろん、それは問題ではありません。カスタムプロパティをまだ作成していないので、ここではデフォルトのコンストラクタを省略しました。 – Bergi

    +0

    しかし、私は 'constructor()'を持つことができず、superを呼び出さずにこのプロパティを設定することはできません。このエラーをスローします。「this」はsuper()の前には許可されません。 – ThomasReggi

    関連する問題