2012-07-05 50 views
1

我正在开发基于浏览器的nod​​e.js服务器游戏。我试图实现一个基于组件的继承结构,但我不确定关于JavaScript继承的概念。基于Javascript组件的游戏设计

据我所知,如果我想继承两个组件对象,例如function Moves(){}function IsVisible(){},通常的原型继承不起作用:

gameObject.prototype = new Moves; 
gameObject.prototype = new IsVisible; 

的是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

尝试使播放器构造函数,并使用传统的JavaScript继承方式,可以在网络上找到。 – Bergi

+0

@Bergi Javascript不支持多重继承,所以使用'person.prototype = new WorldSpace; person.prototype = new Active'不起作用。 – RobotEyes

+1

你不想多重继承,你只需要混入 - 你的代码中没有原型。 AaditMShah是完全正确的。 – Bergi

回答

4

从我在代码中看到的你并不需要多重继承。您只是试图将来自不同构造函数的代码混合成一个。这是可能的,而且在JavaScript中实现起来非常简单。

首先让我们重新编写代码Player

function Player(name) { 
    this.name = name; 
    WorldSpace.apply(this); 
    Active.apply(this); 
} 

就是这样。简单的权利?让我来解释一下apply功能是如何工作的:

  1. 在JavaScript中每个函数都有一个名为this特殊指针。
  2. 当您正常调用函数this通常指向全局对象(例如window)。
  3. 当您调用以关键字new开头的函数时,JavaScript会创建该函数的一个实例,并且this指向该实例。
  4. JavaScript还有两个函数callapply这是每个函数的方法,并允许您使用this指针的任何值调用该函数。

所以基本上当我打电话WorldSpace.applythis作为第一个参数,该this指针在WorldSpace功能点在Playerthis。您基本上使用WorldSpaceActive构造函数作为mixins

如果您想了解更多关于继承如何在JavaScript中工作的信息,我建议您阅读answer。你有没有考虑过使用framework来让你的生活更简单?

+0

辉煌,我知道必须有一个更好的方式来做到这一点。我现在没有考虑一个框架来专注于学习核心JavaScript。谢谢你的帮助。 – RobotEyes