2012-12-27 2 views
0

클래스에 이벤트 수신기를 추가하려고하는데 개체에 '켜짐'메서드가 없다는 것을 알리는 데 실패합니다. 나는 그것을 인스턴스화하는 방법Node.js 상속 이벤트 상속이 실패합니다.

var events = require('events'); 
var util = require('util'); 

var Motion = function Motion (app) { 

    events.EventEmitter.call(this); 

    // Load models 
    app.loadModel('motion', 'motion'); 

    this.on('testevent', function() { 
     console.log('an event has happened'); 
    }); 

    this.emit('testevent'); 

} 

util.inherits(Motion, events.EventEmitter); 

module.exports = Motion; 

을 그리고 여기에 : 여기

는 자신의 파일에있는 클래스의

var Motion = require('./plugins/motion.js'); 
var motion = new Motion(app); 
+0

당신은 Node.js를 어떤 버전을 사용합니까? 귀하의 코드는 node.js v0.8.16에서 저에게 잘 작동합니다. –

답변

2

당신이 이벤트 이미 터로 생성자 함수 자체를 요청 할 수있다 같습니다 . 코드는 생성자와 함께 new에 의해 생성 된 객체를 만듭니다. 즉 코드 조각의 끝에 생성 된 motion 오브젝트는 on 메소드를 가져야합니다 (Vadim Baryshev 노트와 같이 이것이 의도 인 경우 코드가 그대로 작동해야합니다. 그렇다면 나머지 부분은 무시할 수 있습니다). 대답).

정말로 생성자가 이벤트를 내보내 길 원한다면 this questionthe answer을보십시오. 그러나, 그것은 큰 해결책이 아니며, 비표준 __proto__을 사용하지 않고 그것을 할 방법이없는 것 같습니다.

더 나은 솔루션은 생성자 함수가 별도의 이벤트 이미 터 객체를 만들어 방출에 사용하는 것입니다. 내가 생성자 - 모듈 패턴을 좋아하는 한, 그것은 버려 져야한다. 많은 노드 모듈은 모듈 자체를 이미 터로 만들고 모듈에 의해 생성자로 함수가 노출됩니다. 예를 들어 :

var events = require('events'); 
var util = require('util'); 

exports = module.exports = new events.EventEmitter(); 

exports.Motion = function (app) { 
    // Load models 
    app.loadModel('motion', 'motion'); 

    // Emit event 
    exports.emit('testevent'); 
}; 

및 인스턴스화합니다 :

var motion = require('./plugins/motion'); 

motion.on('testevent', function() { 
    console.log('an object was constructed'); 
}); 

var motionObj = new motion.Motion(app);