求教:一个关于JS多重继承的问题(已解决)
发布于 8 年前 作者 zouzhenxing 5027 次浏览 来自 问答

我有一个基类,一个子类 var base = function() { }

var child = function() { }

我想让child类中继承base类的同时,也继承events.EventEmitter。 我尝试了我所知的方法,但子类始终无法使用this.emit();触发我绑订的事件。

8 回复

多重继承光靠原型肯定不行,要将所有父类原型拷贝给子类,我没有仔细考虑过,也没有验证过,不清除这种设计细节上有没有问题,但我肯定不会去搞什么多重继承。

我很好奇,什么样的需求要让你这么设计继承关系,我让base类直接继承自EventEmitter不就行了?

@coordcn 直接在base上继承了也不行,你可以试试。

试试node包util, orchestrator

估计是你没调用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');

@zouzhenxing

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;

回到顶部