我正在node.js服务器上开发基于浏览器的游戏。我正在尝试实现基于组件的继承结构,但我不确定有关javascript继承的概念。
据我所知,如果我想继承两个组件对象,例如function Moves(){}
和function IsVisible(){}
,通常的原型继承不起作用:
gameObject.prototype = new Moves;
gameObject.prototype = new IsVisible;
is IsVisible
对象将Moves
对象覆盖为gameObject
原型。
下面是我尝试创建一个继承函数,该函数将目标对象和任意数量的组件对象作为参数。然后,目标对象从这些组件继承行为和变量。
我不熟悉javascript继承,想知道下面的方法是否是在javascript中实现多继承类型结构的好方法?
还有其他完善的做法可以解决这个问题吗? (如果是问题...... )
非常感谢任何帮助。
function inherit(o){
var proto = o;
for(var i = 1; i < arguments.length; i++){
var component = new arguments[i]();
for(var x in component){
proto[x] = component[x];
}
}
}
function Player(name){
var o = {};
o.name = name;
inherit(o, WorldSpace, Active);
return o;
}
function WorldSpace(){
this.pos = {x:0, y:0};
this.orientation=0;
}
function Active(){
this.acceleration = 1;
this.velocity = {x:0,y:0};
this.rotation = 0;
this.rotationSpeed = (Math.PI*2)/30;
this.throttle = false;
this.currentSpeed = 0;
this.maxSpeed = 10;
}
答案 0 :(得分:4)
从我在你的代码中看到的,你并不需要多重继承。您只是尝试将来自不同构造函数的代码混合到一个代码中。这是可能的,实际上在JavaScript中实现起来非常简单。
首先让我们重写Player
的代码:
function Player(name) {
this.name = name;
WorldSpace.apply(this);
Active.apply(this);
}
就是这样。简单吧?让我解释一下apply
函数的工作原理:
this
的特殊指针。this
通常指向全局对象(例如window
)。new
的函数时,JavaScript会创建该函数的实例,this
指向该实例。call
和apply
,它们是每个函数的方法,允许您使用this
指针的任何值调用该函数。因此,当我以WorldSpace.apply
作为第一个参数调用this
时,this
函数中的WorldSpace
指针指向this
Player
}}。您基本上使用WorldSpace
和Active
构造函数作为mixins。
如果您想了解有关继承如何在JavaScript中运行的更多信息,建议您阅读此answer。您是否考虑过使用framework让您的生活变得更简单?