Ваш код не вызывает наследования classX и classY классом Z, он просто копирует их свойства / методы.
Object.getOwnPropertyNames(abjz)
показывает: -
messageX,alertX,messageY,alertY,messageZ,alertZ
Но для наследования вы хотите, чтобы методы оповещения оставались только в своих соответствующих классах, чтобы любые изменения в них были отражены в abjz позже. Кроме того, чтобы не возникало проблем с обслуживанием метода, если вы создадите больше экземпляров, таких как abjz.
Вы можете сделать это: -
var classX = {}
classX.messageX = "this is X Message"
classX.alertX = function(){
alert(this.messageX)
}
var classY = Object.create(classX)
classY.messageY = "this is Y Message"
classY.alertY = function(){
alert(this.messageY)
}
var classZ = Object.create(classY)
classZ.messageZ = "this is Z Message"
classZ.alertZ = function(){
alert(this.messageZ)
}
var abjz = Object.create(classZ)
, что эквивалентно: -
function classX(){}
classX.prototype.messageX = "this is X Message"
classX.prototype.alertX = function(){
alert(this.messageX)
}
function classY(){}
classY.prototype = classX.prototype
classY.prototype.messageY = "this is Y Message"
classY.prototype.alertY = function(){
alert(this.messageY)
}
function classZ(){}
classZ.prototype = classY.prototype
classZ.prototype.messageZ = "this is Z Message"
classZ.prototype.alertZ = function(){
alert(this.messageZ)
}
var abjz = new classZ()
Оба должны вывести: -
alert( Object.getOwnPropertyNames(abjz) ) //
abjz.alertX() // this is X Message
abjz.alertY() // this is Y Message
abjz.alertZ() // this is Z Message
Итак, теперь abjz наследует от classZ, который наследует от classY, который наследует от classX в линейной цепочке прототипов, например так: -
abjz --> classZ --> classY --> classX
Это не множественное наследование. Чтобы получить это, abjz должен наследовать напрямую от каждого из classX, classY и classZ без цепочки, т.е.
abjz --> classZ
abjz --> classY
abjz --> classX
К сожалению, система цепочек прототипов JS не позволяет этого, и гибкие преимущества множественного наследования уничтожаются заказанной цепочкой прототипов. Например, если вы также хотите, чтобы экземпляр cdef наследовал только от classZ и classX: -
cdef --> classZ --> classX
тогда в JS прототип classZ должен быть изменен с classY на classX, и это портит экземпляр abjz. В то время как в множественном наследовании: -
cdef --> classZ
cdef --> classX
classZ остаётся безучастным, потому что нет неловкой цепочки, с которой нужно иметь дело.