2014-03-06 101 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