我正在 node.js 服务器上开发基于浏览器的游戏。我正在尝试实现基于组件的继承结构,但我不确定有关 javascript 继承的概念。
据我所知,如果我想继承两个组件对象,例如function Moves(){}
和 function IsVisible(){}
,通常的原型(prototype)继承不起作用:
gameObject.prototype = new Moves;
gameObject.prototype = new IsVisible;
IsVisible
对象覆盖了 Moves
对象作为 gameObject
原型(prototype)。
下面是我尝试创建一个以目标对象和任意数量的组件对象作为参数的继承函数。然后目标对象从这些组件继承行为和变量。
我不熟悉 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;
}
最佳答案
从我在您的代码中看到的情况来看,您实际上并不需要多重继承。您只是想将来自不同构造函数的代码混合成一个。这是可能的,而且在 JavaScript 中实现起来实际上非常简单。
首先让我们为 Player
重写代码:
function Player(name) {
this.name = name;
WorldSpace.apply(this);
Active.apply(this);
}
就是这样。简单吧?让我解释一下 apply
功能有效:
- JavaScript 中的每个函数都有一个特殊的指针,称为
this
。 . - 当你正常调用函数时
this
通常指向全局对象(例如window
)。 - 当您调用以关键字
new
开头的函数时JavaScript 创建该函数的一个实例,并且this
指向那个实例。 - JavaScript 还有两个函数
call
和apply
这是每个函数的方法,允许您使用this
的任何值调用该函数指针。
基本上当我调用 WorldSpace.apply
时与 this
作为第一个参数,this
WorldSpace
中的指针功能点 this
在Player
.您实际上是在使用 WorldSpace
和 Active
构造函数为 mixins .
如果您想了解更多有关 JavaScript 中继承如何工作的信息,我建议您阅读这篇文章 answer .您是否考虑过使用 framework让您的生活更简单?
关于基于 Javascript 组件的游戏设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11336520/