1

我正在 node.js 服务器上开发基于浏览器的游戏。我正在尝试实现基于组件的继承结构,但我不确定有关 javascript 继承的概念。

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

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

isIsVisible对象将对象覆盖MovesgameObject原型。

下面是我尝试创建一个继承函数,该函数接受一个目标对象和任意数量的组件对象作为参数。然后目标对象从这些组件继承行为和变量。

我不熟悉 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;
}
4

1 回答 1

4

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

首先让我们重写你的代码Player

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

就是这样。简单吧?让我解释一下这个apply函数是如何工作的:

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

所以本质上,当我调用WorldSpace.applywiththis作为第一个参数时,函数中的this指针指向in 。您本质上是使用and构造函数作为mixinsWorldSpacethisPlayerWorldSpaceActive

如果您想了解更多关于继承在 JavaScript 中的工作原理,我建议您阅读这个答案。您是否考虑过使用框架来简化您的生活?

于 2012-07-05T03:52:12.320 回答