2015-09-16 63 views
1

我想了解對象如何變成事件發射器。該文件具有類似於下面的代碼的東西:事件發射器構造函數

var EventEmitter = require('events').EventEmitter; 

function Job(){ 
    EventEmitter.call(this); 
} 

我不清楚是什麼的呼叫功能在這裏做,顯然調用EventEmitter的構造?

> var j = new Job() 
undefined 
> j.emit('test') 
TypeError: Object #<Job> has no method 'emit' 

在通過Job.prototype = new EventEmitter;設置原型後,似乎按預期工作。

+1

更重要的接下來是'util.inherits(Job,EventEmitter);'。請檢查[this](https://nodejs.org/api/events.html#events_inheriting_from_eventemitter) – thefourtheye

+0

http://blog.slaks.net/2013-09-03/traditional-inheritance-in-javascript/ – SLaks

回答

2

我不清楚調用函數在這裏做什麼,顯然調用EventEmitter的構造函數?

是的,它基本上是一個super調用,它初始化發射器實例。請參閱What is the difference between these two constructor patterns?瞭解它的功能。

設置原型後,它似乎按預期工作。

確實,您需要讓您的JobEventEmitter繼承。但是,你真的should not use new here,而是

Job.prototype = Object.create(EventEmitter.prototype); 

也看看Node.js - inheriting from EventEmitter

+0

我認爲按照我的回答做得更加正確,更加標準。只是我的2ct – DevAlien

+0

@DevAlien:*更正確?不是真的 - 這是'util.inherits'在內部做的。我承認它可能是更「節點」的繼承方式,而Object.create只是慣用的純JavaScript。 – Bergi

0

下面的工作定義,你可以從EventEmitter繼承如下

util.inherits(Job, EventEmitter); 

工作,只要你想成爲一個eventemitter。這就是「推」一「對象」

0

隨着ES6的一個很好的方式(我用babel雖然它沒有必要用最新的節點大多數功能),你可以這樣做:

import {EventEmitter} from 'events'; 

export class Job extends EventEmitter { 
    constructor() { 
    super(); 
    } 
} 

let job = new Job();