可能已经以某种形式询问了这一点,我尝试检查此资源:https://developer.mozilla.org/en/docs/Web/JavaScript/Inheritance_and_the_prototype_chain
我的gameobject.js看起来像这样:
function GameObject(program)
{
this.program = program;
this.graphics = null;
}
GameObject.prototype.update = function(dt)
{
}
GameObject.prototype.draw = function()
{
// Here graphics would be the graphics of the child class,
// because the graphics would be replaced with the child class' graphics
if(this.graphics !== null)
this.program.renderer.render(this.graphics);
}
我想要另一个名为box.js的课程:
function Box(program, width, height, x, y)
{
// Call base constructor here?
this.width = width;
this.height = height;
this.x = x;
this.y = y;
}
现在我想基本上从GameObject继承更新和绘制方法,并使用program参数调用GameObject构造函数,这样最终该东西应该像这样工作:
var box = new Box(program, 10, 10, 100, 100);
// In game class update method
box.update(this.td);
// In game class draw method
box.draw();
所以基本上就像在C#中完成它一样。如果我能让Box继承更新并从GameObject中绘制方法,那么它已经有了很多帮助。
编辑1:Jsfiddle:https://jsfiddle.net/0df9rfu5/1/
编辑2:我尝试了这样的解决方法:
function Box(program, width, height, x, y)
{
var self = this;
this.base = new GameObject(program);
this.width = width;
this.height = height;
this.x = x;
this.y = y;
this.update = function(dt) { self.base.update(dt); };
this.draw = this.base.draw();
}
因此,每次创建Box时,我都会创建一个基类GameObject的新实例,然后将“更新和绘制方法”框设置为GameObject的那些。
虽然这不是诀窍,但我认为这种方法存在任何问题。
编辑3:也许我应该这样做,就像我一直做的那样...从GameObject继承的所有东西仍然必须覆盖更新和绘制方法。只是我想我不能确定gameobject列表中的每个对象都有绘制和更新方法,我只需要假设它们。
答案 0 :(得分:1)
JavaScript中的构造函数只是普通函数。要从GameObject
构造函数中调用Box
,您可以使用:
GameObject.call(this, program);
要让Box
个对象从GameObject
继承,请使用
Object.setPrototypeOf(Box.prototype, GameObject.prototype);
请务必在第一次调用new Box
之前将上一行放在上面。
为了与旧浏览器(tank @Bergi)的最佳兼容性,您可以使用新对象覆盖Box.prototype
,而不是使用Object.setPrototypeOf
。
Box.prototype = Object.create(GameObject.prototype, { configurable: true, writable: true, value: Box });
然后,您应该能够在draw
个对象上使用update
和Box
方法。
以下示例可让您走上正确的轨道
function GameObject(program)
{
this.program = program;
this.graphics = null;
}
GameObject.prototype.update = function(dt)
{
alert('updating');
}
GameObject.prototype.draw = function()
{
// Here graphics would be the graphics of the child class,
// because the graphics would be replaced with the child class' graphics
if(this.graphics !== null)
this.program.renderer.render(this.graphics);
}
function Box(program, width, height, x, y)
{
GameObject.call(this, program);
this.width = width;
this.height = height;
this.x = x;
this.y = y;
}
Object.setPrototypeOf(Box.prototype, GameObject.prototype);
let b = new Box();
b.update();