如何";扩展;javascript";“类”;添加新的东西?

如何";扩展;javascript";“类”;添加新的东西?,javascript,parent-child,Javascript,Parent Child,好的,我要做的是创建一个抛射类,然后创建一个BasicShot类,它以Java中的方式“扩展”抛射 我想将父类拥有的变量设置为父类,并在子类中设置任何新的变量 var Projectile = function(x, y){ this.x = x; this.y = y; } Projectile.prototype.update(){ console.log("should not be called"); } Projectile.prototype.che

好的,我要做的是创建一个抛射类,然后创建一个BasicShot类,它以Java中的方式“扩展”抛射

我想将父类拥有的变量设置为父类,并在子类中设置任何新的变量

var Projectile = function(x, y){
     this.x = x;
     this.y = y;
}

Projectile.prototype.update(){
     console.log("should not be called");
}

Projectile.prototype.checkIfWallHit(){
     console.log("should be called");
}
var BasicShot = new function(x, y, left){
     this = new Projectile(x,y);
     this.left = left;
}

BasicShot.prototype.update(){
     console.log("should be called");
}
然后是儿童班

var Projectile = function(x, y){
     this.x = x;
     this.y = y;
}

Projectile.prototype.update(){
     console.log("should not be called");
}

Projectile.prototype.checkIfWallHit(){
     console.log("should be called");
}
var BasicShot = new function(x, y, left){
     this = new Projectile(x,y);
     this.left = left;
}

BasicShot.prototype.update(){
     console.log("should be called");
}
但当我尝试这样做时,当我尝试创建BasicShot对象时,它会显示“BasicShot未定义”

那么,如何扩展我的射弹类呢?

您可以这样做


以下是基本模式,请参见注释:

/==射弹
//构造器
功能射弹(x,y){
//执行初始化实例的操作。。。
这个.x=x;
这个。y=y;
}
//向其原型添加一些方法
projection.prototype.update=函数(){
//这是一个关于“射弹”的方法`
log(“射弹更新”);
};
Projection.prototype.checkIfWallHit=函数(){
log(“射弹#checkIfWallHit”);
};
//===基本要素
//构造器
功能基本显示(x、y、左){
//给射弹一个做它的事情的机会
投射物。调用(这个,x,y);
this.left=左;
}
//把它挂在弹丸上`
BasicShot.prototype=Object.create(sparket.prototype);
BasicShot.prototype.constructor=BasicShot;//JavaScript在默认情况下是这样做的,所以我们在替换对象时维护它
//向其原型添加方法
BasicShot.prototype.update=函数(){
log(“BasicShot#update”);
};
//==用法
log(“使用投射物”);
var p=新射弹(1,2);
p、 更新();//射弹#更新
p、 checkIfWallHit();//射弹#检查墙击
log(“使用BasicShot”);
var c=新的基本假设(1,2,3);
c、 更新();//BasicShot#更新
p、 checkIfWallHit();//射弹#检查墙壁命中

实现此类继承的最佳方法是使用原型继承

一种通用做法是将全局函数与对象关联,并使用它创建派生对象。(既然全球经济形势不好,也有办法规避这一问题)

您可以按照问题中提出的相同方式覆盖/扩展此basicShot对象的功能

BasicShot.prototype.update = function (){
     console.log("should be called");
};
我强烈推荐阅读这篇关于原型继承的文章,这篇文章绝对值得一读。

由于问题是关于JavaScript,而不是Java,我已经删除了
Java
标记。您是否真的在代码中以
BasicShot.prototype.update(){
的形式编写了它?这不是正确的JS语法。
BasicShot.prototype=new spolution(x,y)
是一种反模式。它是一种反模式的原因实际上从你的代码中是显而易见的:在你定义一个
BasicShot
构造函数时,你会为
x
y使用什么值?@T.J.Crowder我想使用工厂模式,但我无法完成整个代码。下面是一段代码你看看这个,然后给出你的反馈,这对我真的很有帮助。thanx in advanceI建议你只需阅读我的答案,就可以找到正确的方法来使用构造函数。每次你想要一个对象时,小提琴都会产生很多额外的东西,这是不必要和复杂的。你正在创建一个全新的构造函数f每次你创建一个对象时,都要使用函数和全新的原型对象。“实现这种继承的最好方法是使用原型继承”嗯,是的,因为在JavaScript中,这是唯一一种继承。无论是使用构造函数还是构建器函数,都在使用原型继承。很抱歉最近接受了。我花了一段时间才弄明白为什么在我将代码应用到我的项目中时,这段代码不起作用。我正在调用sparlet.call(x,y)打电话给(这个,x,y);无论如何,非常感谢你的帮助:D