1

node.js サーバーでブラウザ ベースのゲームを開発しています。コンポーネントベースの継承構造を実装しようとしていますが、javascript 継承に関する概念がよくわかりません。

function Moves(){}私の知る限り、と などの2 つのコンポーネント オブジェクトから継承したい場合function IsVisible(){}、通常のプロトタイプの継承は機能しません。

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

isオブジェクトは、オブジェクトをプロトタイプとしてIsVisible上書きします。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

私があなたのコードで見たものから、多重継承は本当に必要ありません。異なるコンストラクターのコードを 1 つに混在させようとしているだけです。これは可能であり、実際には 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 にも 2 つの関数がcallあり、これらはすべての関数のメソッドであり、ポインターapplyの任意の値でその関数を呼び出すことができます。this

基本的に、最初の引数としてWorldSpace.applywithを呼び出すと、関数内のポインターは in を指します。基本的に、およびコンストラクターをmixinとして使用しています。thisthisWorldSpacethisPlayerWorldSpaceActive

JavaScript で継承がどのように機能するかについて詳しく知りたい場合は、この回答を読むことをお勧めします。フレームワークを使用して生活を簡素化することを検討したことがありますか?

于 2012-07-05T03:52:12.320 に答える