2017-12-20 13 views

답변

0

가장 쉬운 방법은 ES6 Class syntax via the class keyword을 사용하고 extends 키워드를 사용하여 EventEmitter의 하위 클래스를 만드는 것입니다. 다음은 자신의 EventEmitterPrototypal Inheritance을 통해 만드는 방법의 간단한 예입니다.

EventEmitter.call(emitter); 

마술 모든 EventEmitter 기능으로 터 객체 권한을 부여 할 : 그 개념을 어디서 얻었

// MyEmitter.js 
const EventEmitter = require('events') 

class MyEmitter extends EventEmitter { 
    constructor() { 
    super() 
    this.emit('created', 'New Instance of MyEmitter Created') 
    } 
} 

module.exports = MyEmitter 

// index.js 
const MyEmitter = require('./MyEmitter') 

// Create a new instance of MyEmitter 
const emitter = new MyEmitter() 

// Attach an Event Listener for the 'created' event 
// Print whatever the message is to stdout 
emitter.on('created', message => console.log) 
1

는 잘 모르겠어요. 이 문장이하는 것은 EventEmitter 생성자를 호출하여 객체를 this 인수로 전달하는 것입니다. 그러면 생성자가 실행되고 emitter 객체의 일부 데이터를 설정하지만 어떤 방식 으로든 EventEmitter 프로토 타입을 객체에 연결하지 않으므로 EventEmitter 프로토 타입의 모든 메서드가 객체에 바인딩되지 않으므로 .on()이되는 이유는 무엇입니까? undefined.


제어 할 수있는 대상과 수행하려는 작업에 따라 기존 개체의 기능을 수행하는 방법은 여러 가지가 있습니다.

EventEmitter이 될 개체의 정의를 제어하는 ​​경우 EventEmitter 개체에서 상속 받기를 원할 경우 해당 개체는 단지 EventEmitter이되며 해당 메서드와 데이터가 모두 있습니다 .

상속 ES6 클래스 구문 : 다음

// myobj.js 
const EventEmitter = require('events'); 

// inherit directly from EventEmitter 
class MyObj extends EventEmitter { 
    constructor() { 
    super() 
    } 
    // your other custom methods here 
} 

module.exports = MyObj; 

, 당신은 같은 것을 사용합니다 :

const MyObj = require("myobj.js"); 
let obj = new MyObj(); 
obj.on("hello", data => { 
    console.log("got hello message"); 
}); 

obj.emit("hello", "to you"); 

당신이 개체의 정의 나 구조를 제어하지 않으면 그 당신은 EventEmitter 논리를주고 싶다면, 당신은 EventEmitter가 될지, 아니면 가질지를 결정할 필요가 있습니다.

"be a"경로 (오브젝트가 "자체적 인 기능"이면서 "EventEmitter"이되기를 원하는 경우, EventEmitter 오브젝트의 로직을 혼합하여 모든 메소드 및 데이터를 사용자 오브젝트에 추가하십시오 자신의 개체가 생성 된 후에도이 작업을 수행 할 수 있습니다. 일부 개체 유형은 개인 데이터에 의존하여 혼합 할 수 없으므로 완벽하지 않습니다. 그러나 많은 개체에서 작동합니다.

EventEmitter의 경우 특정 개체가 있습니다. 당신이 "mixin"과 EventEmitter을 할 수 있도록 만들어진 모듈입니다. 이것은 component-emitter on NPM이라고 불리우며 매우 사용하기 쉽습니다. socket.io는 소켓 객체가 EventEmitter 일 수 있도록 right here을 사용합니다.대한


var Emitter = require('component-emitter'); 

/** 
* Mix in `Emitter`. 
*/ 

Emitter(Socket.prototype); 

경로의 "있다", 당신은 단순히 EventEmitter 개체를 만들고 자신의 개체의 인스턴스 데이터에 넣어 다음 EventEmitter 기능을 특정 객체를 참조하십시오. 해당 객체를 수동으로 가져 와서 사용하거나 자동으로 사용하는 메소드를 가질 수 있습니다. 이것은 구현하기가 더 쉽고 간단하지만 어떤 경우에는 사용하기가 편리하지 않습니다 (모두 실제로 수행하려는 작업의 세부 사항에 달려 있습니다).

class MyObj { 
    constructor() { 
    super() 
    this.myEmitter = new EventEmitter(); 
    } 
    // your other custom methods here 
    broadcast(msg, data) { 
     // use the internal eventEmitter object we have in our instance data 
     this.myEmitter.emit(msg, data); 
    } 
} 

module.exports = MyObj; 
0

당신도 당신이 EventEmitter 클래스를 확장하거나 EventEmitter의 프로토 타입 emitter의 프로토 타입을 설정, 두 가지 방법이있다 해결할 수 있습니다;

// using es6 class 

class MyEmitter extends EventEmitter { 
    constructor() { 
     super(); 
    } 
} 

const emitter = new MyEmitter(); 

emitter.on("greet", greet => console.log(greet)); 

emitter.emit("greet", "hello"); 

// if you want to use this on a different file you have to export the emitter object 



// the second alternative if you don't want to use a class 

const emitter = {}; 

Object.setPrototypeOf(emitter, events.prototype); 

// or 

Object.setPrototypeOf(emitter, events.EventEmitter.prototype); 

emitter.on("greet", greet => console.log(greet)); 

emitter.emit("greet", "hello");