Javascript继承具有父函数的功能?

Javascript继承具有父函数的功能?,javascript,inheritance,prototype,Javascript,Inheritance,Prototype,所以。。这是我的问题。。我有以下代码(示例): e.doDamage的输出是GameObject中定义的函数。但我希望它是生物中定义的函数。为什么它不使用那个呢?我认为要解决这个问题,把生物功能放在游戏对象功能之上我认为要解决这个问题,把生物功能放在游戏对象功能之上在原型中定义你的功能,使用游戏对象.call(this,posX,posY,width,height);要扩展父级中的属性,请使用bioture.prototype=Object.create(GameObject.prototype

所以。。这是我的问题。。我有以下代码(示例):


e.doDamage
的输出是
GameObject
中定义的函数。但我希望它是
生物
中定义的函数。为什么它不使用那个呢?

我认为要解决这个问题,把
生物
功能放在
游戏对象
功能之上

我认为要解决这个问题,把
生物
功能放在
游戏对象

功能之上

原型
中定义你的功能,使用
游戏对象.call(this,posX,posY,width,height);
要扩展父级中的属性,请使用
bioture.prototype=Object.create(GameObject.prototype);
扩展父级中的函数并更改构造函数属性的值。有关详细信息


prototype
中定义函数,使用
GameObject.call(this,posX,posY,width,height);
扩展父级中的属性,使用
bioter.prototype=Object.create(GameObject.prototype);
扩展父级中的函数并更改构造函数属性的值。有关详细信息,请参阅


问题是,当你调用敌人的构造函数时,你已经覆盖了
这个.constructor
两次。所以当你从你的敌人类调用
这个.constructor
时,你实际上是在调用
游戏对象
构造函数并完全绕过
生物
构造函数。要解决这个问题,你需要显式调用构造函数

因此,在你的
生物
类中,你需要调用以下命令:

GameObject.call(this, posX, posY, width, height);
Creature.call(this, posX, posY, width, height);
而不是

this.constructor(posX, posY, width, height);
在你的
敌人
类中,你需要调用以下命令:

GameObject.call(this, posX, posY, width, height);
Creature.call(this, posX, posY, width, height);

这是一个正在运行的现场演示:

var GameObject=函数(posX、posY、宽度、高度){
log(“调用了GameObject构造函数”);
this.posX=posX;
this.posY=posY;
这个。宽度=宽度;
高度=高度;
这是健康=100;
this.doDamage=功能(损坏){
//什么也不做。。
}
}
变量生物=功能(posX、posY、宽度、高度){
log(“调用的生物构造函数”);
调用(this,posX,posY,width,height);
this.doDamage=功能(损坏){
这是健康-=损害;
}
}
bioture.prototype=新游戏对象();
var=功能(posX、posY、宽度、高度){
log(“调用的敌人构造函数”);
召唤(这个,posX,posY,宽度,高度);
}
敌方原型=新生物();
控制台日志(“设置完成”);
var e=新敌人(40,40,10,10);
e、 多达梅(20);
document.getElementById(“输出”).textContent=e.health;
初始健康状况:100
20减去健康

最终生命值:
问题是,当你调用敌人的构造函数时,你已经覆盖了
这个.constructor
两次。所以当你从敌人类调用
这个.constructor
时,你实际上是在调用
游戏对象
构造函数,并完全绕过
生物
构造函数。T要解决这个问题,您需要显式调用构造函数

因此,在你的
生物
类中,你需要调用以下命令:

GameObject.call(this, posX, posY, width, height);
Creature.call(this, posX, posY, width, height);
而不是

this.constructor(posX, posY, width, height);
在你的
敌人
类中,你需要调用以下命令:

GameObject.call(this, posX, posY, width, height);
Creature.call(this, posX, posY, width, height);

这是一个正在运行的现场演示:

var GameObject=函数(posX、posY、宽度、高度){
log(“调用了GameObject构造函数”);
this.posX=posX;
this.posY=posY;
这个。宽度=宽度;
高度=高度;
这是健康=100;
this.doDamage=功能(损坏){
//什么也不做。。
}
}
变量生物=功能(posX、posY、宽度、高度){
log(“调用的生物构造函数”);
调用(this,posX,posY,width,height);
this.doDamage=功能(损坏){
这是健康-=损害;
}
}
bioture.prototype=新游戏对象();
var=功能(posX、posY、宽度、高度){
log(“调用的敌人构造函数”);
召唤(这个,posX,posY,宽度,高度);
}
敌方原型=新生物();
控制台日志(“设置完成”);
var e=新敌人(40,40,10,10);
e、 多达梅(20);
document.getElementById(“输出”).textContent=e.health;
初始健康状况:100
20减去健康
最终健康状况:
为什么不用那个

constructor
以继承属性开始。定义函数
F
时,将创建两个对象:函数对象本身
F
,以及函数的原型对象属性
F.prototype
。原型对象的构造函数属性指向F:
F.prototype.constructor=F;

如果现在将
F.prototype
设置为不同的对象值,则由
F
新创建的对象将从您设置的新原型对象继承其构造函数属性。如果进一步创建对象的原型链,则基于最后一个原型对象创建的对象通常从第一个对象继承其构造函数原型链中的ct。这就是为什么
中的
这个.constructor
调用
游戏对象而不是
生物

注意
constructor
值可以在javascript对象上更改。作为构造函数和可继承方法调用函数的另一种方式是将其附加到其原型对象上

GameObject.prototype.setup = GameObject; // inherit GameObject as setup method
为什么不用那个

constructor
以继承属性开始。定义函数
F
时,将创建两个对象:函数对象本身
F
,以及函数的原型对象属性
F.prototype
。原型对象的构造函数属性指向F:
F.prototype.constructor=F;

如果现在将
F.prototype
设置为不同的对象值,则