我有一个基类,一个子类 var base = function() { }
var child = function() { }
我想让child类中继承base类的同时,也继承events.EventEmitter。 我尝试了我所知的方法,但子类始终无法使用this.emit();触发我绑订的事件。
多重继承光靠原型肯定不行,要将所有父类原型拷贝给子类,我没有仔细考虑过,也没有验证过,不清除这种设计细节上有没有问题,但我肯定不会去搞什么多重继承。
我很好奇,什么样的需求要让你这么设计继承关系,我让base类直接继承自EventEmitter不就行了?
想了半天,原来是一个地方写错了。顺序不能反,唉~~~~~
var events = require(“events”);
var base = function() {} base.prototype = new events.EventEmitter();
var child = function() { }
child.prototype.t2 = function() { this.emit(“ok”); } child.prototype = new base();
var c = new child(); c.on(“ok”,function(){ console.log(“ok”); }); c.t2();
C:\wamp\www\nodehttp\expresstest\test.js:18 c.t2(); ^
TypeError: c.t2 is not a function at Object.<anonymous> (C:\wamp\www\nodehttp\expresstest\test.js:18:3) at Module._compile (module.js:435:26) at Object.Module._extensions…js (module.js:442:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:313:12) at Function.Module.runMain (module.js:467:10) at startup (node.js:136:18) at node.js:963:3
// ES5
var util = require('util');
var EventEmitter = require('events');
function Base() {
// ...
}
util.inherits(Base, EventEmitter);
function Child() {
EventEmitter.call(this);
// ...
}
util.inherits(Child, Base);
var child = new Child();
child.on('foo', function(){
console.log('bar');
});
child.emit('foo');
var util = require('util')
var Emitter = require('events')
function ClassA() {
Emitter.call(this);
}
util.inherits(ClassA, Emitter);
function ClassB() {
ClassA.call(this);
}
ClassB.prototype.test = function(){
this.emit('test');
};
util.inherits(ClassB, ClassA);
var b = new ClassB();
b.on('test', function(){
console.log('test');
});
b.test();
还真被 @William17 说中了。。。
认真总结下我犯的错误 baseModule.js
var mysql = require(“mysql”); var events = require(“events”); var util = require(“util”);
var baseModule = function() {} baseModule.prototype = new events.EventEmitter(); baseModule.prototype.getConn = function() { var connection = mysql.createConnection({ host : ‘localhost’, user : ‘root’, password : ‘’, database : ‘epay’ });
connection.connect(function( err ) {
if( err ) {
return console.log(err);
}
});
return connection;
}
module.exports = baseModule;
loginModule.js
var baseModule = require("./baseModule.js");
var loginModule = function() {} loginModule.prototype = new baseModule(); 第一处错误,继承要写在login的上面。 loginModule.prototype.login = function( obj ) { var conn = this.getConn();
var sql = "select * from admin where name = ? and password = ?";
var param = [obj.email,obj.password];
**var that = this;
第二处错误:回调中不能使用this。后面看fs的源代码才发现有一个that,原来是这个意思。
var query = conn.query(sql,param,function( err,rows,filed ){
if( err ) {
console.log(err);
that.emit("err");
}
that.emit("success",rows,filed);
});**
console.log(query.sql);
conn.end();
return this;
}
module.exports = loginModule;