2014-03-06 38 views
0

我正在自己的模型层上工作,在节点应用程序中。我们有一个ModelBase类,我们所有的模型都从它继承而来。这很好。我现在想要做的是使模型能够从其他模型继承,以便他们也继承他们的模式和原型方法。如何在javascript中多重继承

我有99%的工作,除了扩展模式。我希望有人能帮我找出一个优雅的解决方案。我想不将模式传递给模型构造函数。

下面是一个基本示例,其中显示了示例ModelBase,ModelA和ModelB。

我希望ModelB的模式扩展ModelA的模式。帮助与此将不胜感激。

var util = require('util'); 

// BASE MODEL 
var ModelBase = function(schema) { 
    this.schema = schema; 
}; 

ModelBase.prototype.baseMethod = function() { 
    return console.log('base method'); 
}; 

// MODEL A inherits from MODEL B 
var SCHEMA_A = { a: 'foo' }; 

var ModelA = function() { 
    ModelBase.call(this, SCHEMA_A); 
}; 

util.inherits(ModelA, ModelBase); 

ModelA.prototype.test = function() { 
    return console.log('test'); 
}; 

ModelA.prototype.foo = function() { 
    return console.log('foo'); 
}; 

// MODEL B inherits from MODEL A 
var SCHEMA_B = { b: 'foo' }; 

var ModelB = function() { 
    ModelA.call(this, SCHEMA_B); 
}; 

util.inherits(ModelB, ModelA); 

ModelB.prototype.test = function() { 
    return console.log('test B'); 
}; 

// 
var mdlA = new ModelA(); 
var mdlB = new ModelB(); 

console.log(mdlA instanceof ModelBase); // true 
console.log(mdlB instanceof ModelA); // true 

// mdlA.test(); // test 
// mdlB.test(); // test 
// mdlB.foo(); // foo 

console.log(mdlA.schema); // { a: 'foo' } 
console.log(mdlB.schema); // { a: 'foo' }, should also have { b: 'foo' } 

我不太确定如何做到这一点,但我已经很好地掌握了它为什么会如此工作。 ModelB继承了ModelA的原型,该原型使用SCHEMA_A调用ModelBase,失去了SCHEMA_B。我不知道如何解决这个问题。

任何想法?

回答

0

您可以通过复制“孩子”上的“父母”原型成员来完成混合或多重继承,但instanceOf不再是真实的。然后,您可能需要运行父母的多个初始化程序。当ParentA和ParentB具有相同的方法时,您必须决定是否要堆叠它们(用于getAvailableMethods等方法)或覆盖它们(最后一个“继承”覆盖先前的一个)

可以找到混合的示例here