1

私は JavaScript で構築されたチェス ゲームに取り組んでいます。私はそれにオブジェクト指向のアプローチを取っていますが、JavaScript の継承を扱うのに苦労しています。いくつかのフィールドと基本的なゲッター/セッターを保持する「ピース」抽象クラスが必要です。このピースは黒または白です。次に、次のようにインスタンス化できる各タイプのピースのクラスが必要です。

var pieceOne = new Pawn();

Pawn() には Piece のすべてのフィールドとメソッドが必要ですが、移動のための独自のメソッドと追加のフィールド (ほとんどのピースでは問題にならないため、まだ移動しているかどうかなど) が必要です。これが私の現在の Piece クラスです:

//This object specifies basic information about pieces.
"use strict";
function Piece(color, type, captured, hasMoved) {    
    this.color = color;
    this.type = type;
    this.captured = captured;
    this.hasMoved = hasMoved;
    this.image = color + "_" + type + ".svg";
}
Piece.prototype.getImage = function getImage(){
    return this.image;
}
Piece.prototype.isCaptured = function isCaptured(){
    return this.captured;
};

おそらく「タイプ」フィールドを削除するすべての種類のピースのサブクラスを作成するかどうかはわかっていますが、どうすればポーンのサブクラスを作成できますか? このようなもの?

function Pawn() = new Piece(color, captured, hasMoved);
Pawn.prototype.getLegalMoves = function getLegalMoves(){
    //return legal moves
}
var pieceOne = new Pawn("black", false, false);
4

5 に答える 5

0

これを見てください:https://github.com/haroldiedema/joii

var BaseClass = function() 
{
    this.some_var = "foobar";

    /**
     * @return string
     */
    this.someMethod = function() {
        return this.some_var;
    }
};

var MyClass = new Class({ extends: BaseClass }, function()
{
    /**
     * @param string value
     */
    this.__construct = function(value)
    {
        this.some_var = value;
    }

})

使用法:

var obj = new MyClass("Hello World!");
console.log( obj.someMethod() ); // Hello World!
于 2014-01-22T15:58:29.837 に答える
0

Pieceのコンストラクターを呼び出して、そのコンストラクターをインスタンスPawnで動作させることができます。Pawn

function Pawn(/* args... */) {
    Piece.call(this, color, type, captured, hasMoved);
    /* Pawn-specific constructor code... */
}
于 2013-05-02T21:58:02.177 に答える
0

特定のピースコンストラクターのプロトタイプを のインスタンスに設定するだけの問題だと思いますPiece。例えば:

Pawn.prototype = new Piece("", false, false);

ただし、これはPiecenew をインスタンス化するたびに (スーパー) コンストラクターを呼び出すわけではないため、コンストラクターPawnから色、型などを手動で割り当てる必要があります。Pawn

--編集--

代わりにこれを好むかもしれません: Javascript の継承: スーパーコンストラクターを呼び出すか、プロトタイプ チェーンを使用しますか?

于 2013-05-02T21:46:11.060 に答える
0

JS でオブジェクト指向のアプローチを採用したい場合は、パワー コンストラクター パターンに従うことをお勧めします。

基本的に、オブジェクトを作成し、クロージャーを利用して内部プロパティ (フィールドまたはメソッド) を非表示にする関数があります。

 function myObject(){
    var that={};
    var myPrivateField;
    var myPrivateFunction=function(){
    }

    that.myPublicMethod=function(){

    }
    return that;

    }

次に、メソッド myObject() を呼び出すだけで、このタイプの新しいオブジェクトを取得できます。

この例を拡張して、別のオブジェクトの強力なコンストラクターを呼び出すだけで継承を使用し、オブジェクト拡張を使用できます。ダグラス・クロックフォードの寄生遺伝の例を見てみましょう。

于 2013-05-02T21:48:33.137 に答える