为什么Javascript中原型继承的嵌套级别总是1?

为什么Javascript中原型继承的嵌套级别总是1?,javascript,Javascript,我试图理解Javascript中原型继承和经典继承之间的区别。我看到一些文章声称,但我不明白为什么。这是因为最后一个继承的原型可以访问其所有祖先的方法或属性,而经典继承只能访问其最后一个祖先的方法或属性吗 从所有祖先访问方法的示例: 显示继承的简单图形: Human ---> Zombie ---> ZombieBoss 代码 功能人员(姓名,hp){ this.name=name this.hp=hp } 人类原型={ 睡眠:功能(){ 这是0.hp+=50 console.lo

我试图理解Javascript中原型继承和经典继承之间的区别。我看到一些文章声称,但我不明白为什么。这是因为最后一个继承的原型可以访问其所有祖先的方法或属性,而经典继承只能访问其最后一个祖先的方法或属性吗

从所有祖先访问方法的示例:

显示继承的简单图形:

Human ---> Zombie ---> ZombieBoss
代码

功能人员(姓名,hp){
this.name=name
this.hp=hp
}
人类原型={
睡眠:功能(){
这是0.hp+=50
console.log('human recovered')
},
建造师:人类
}
功能僵尸(名称,hp){
Human.call(此、名称、hp)
}
Zombie.prototype={
…人类原型,
睡眠:功能(){
此值为0.hp+=100
console.log('zombie recovered')
人类。原型。睡眠。呼叫(此)
},
构造函数:僵尸
}
功能僵尸BOSS(名称,hp){
僵尸。呼叫(这个,名字,hp)
}
ZombieBoss.prototype={
…僵尸,原型,
睡眠:功能(){
这是0.hp+=500
console.log('zombie boss recovered')
Human.prototype.sleep.call(this)//也可以访问来自祖先的祖先的方法。这在super()中是不可能的
Zombie.prototype.sleep.call(this)//来自上一个祖先的方法
},
构造函数:僵尸老板
}
康斯特·金=新僵尸老板('king',1000)
king.sleep()//生命值应该是1700

如果这不是唯一的原因,还有什么其他原因?如果有一些简单的例子就好了。

这是一种复杂的说法:“在JavaScript中,一切都是存在于JS引擎中的具体对象,而不是抽象。”

这很重要!这意味着泛化(如总体鞋概念)只是其他对象。对于经典继承,概括是抽象的抽象。。。一直到最近的后代

这里的抽象级别永远不会超过1原型继承的唯一抽象是对现实世界事物的抽象。

因此,按照他的方式,唯一的抽象是:

JavaScript object <----- real world object that the JavaScript object represents
其实这并不重要,因为它们都是解释器中存在的具体对象,并且每一个都离这些JS对象所代表的可能的真实世界对象有一步之遥


另一方面,您的代码没有正确实现原型继承:

Zombie.prototype = {
  ...Human.prototype,
  sleep: function (){
上面的方法可以帮助避免代码重复,但这些对象中的每一个:
Human.prototype
Zombie.prototype
、和
ZombieBoss.prototype
都有相同对象的内部原型:
object.prototype
。您正在实现的原型链是

Object.prototype -> Human.prototype 
Object.prototype -> Zombie.prototype 
Object.prototype -> ZombieBoss.prototype 
如果您想让原型相互继承并实现您可能正在尝试的操作,则必须使用
对象。创建

Zombie.prototype = Object.create(Human.prototype);
Zombie.prototype.sleep = function() {
  // ...

现在我明白了为什么使用
Object.assign()
不是链接原型的正确方法。如果是这样,是否可以在同一级别继承多个原型?例如,可以通过在同一级别继承A和B来创建AB吗?我可以让AB继承A和B,而不让A继承B或B继承A吗?不是以任何合理的方式。
Object.prototype -> Human.prototype 
Object.prototype -> Zombie.prototype 
Object.prototype -> ZombieBoss.prototype 
Zombie.prototype = Object.create(Human.prototype);
Zombie.prototype.sleep = function() {
  // ...
ZombieBoss.prototype = Object.create(Zombie.prototype);
// ...