2013-05-02 82 views
1

我正在使用JavaScript構建一個國際象棋遊戲。我正在採取面向對象的方法,並且在處理JavaScript的繼承時遇到一些困難。我想要成爲一個「Piece」抽象類,它包含一些領域和基本的getter/setter,比如這件作品是黑色還是白色。那麼我想爲每種類型片的類,我可以實例像這樣:)如何在JavaScript中擴展一個類

var pieceOne = new Pawn(); 

典當(應具有的所有字段和計件的方法,但有其自己的運動方法和附加字段(比如它是否已經移動,因爲這對大多數作品都沒有影響)。這是我目前的一塊類:

//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; 
}; 

我知道,如果我要做出各種一塊我可能會消除「類型」字段中的一個子類,但是我怎麼能讓一個Pawn子類?像這樣?

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

回答

0

我相信這只是將特定構件的原型設置爲Piece的實例。例如:

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

然而,這不會調用Piece(超)構造函數每次實例化一個新的Pawn時間,所以你必須手動從Pawn構造函數指定顏色,類型等:

- 編輯 -

你可能會喜歡這個:Javascript inheritance: call super-constructor or use prototype chain?

0

如果你願意接受一個OBJ在JS上面向ect的方法我會建議你遵循權力構造函數模式。

基本上你有一個函數爲你創建對象並利用閉包來隱藏內部屬性(字段或方法)。

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

    that.myPublicMethod=function(){ 

    } 
    return that; 

    } 

然後你可以調用方法myObject(),你將得到一個這種類型的新對象。

您可以通過調用另一個對象的電源構造函數來擴展此示例以使用繼承,然後使用對象擴充。看看Douglas Crockford的parasatic inheritance的例子。

0

您可以撥打Piece的從Pawn構造和具有該構造操作上Pawn實例:

function Pawn(/* args... */) { 
    Piece.call(this, color, type, captured, hasMoved); 
    /* Pawn-specific constructor code... */ 
} 
2

擴展一個類可以以不同的方式來完成。最簡單的擴展類的方法是使用Object.create方法。這是常用的方法,用於achieve abstraction(鏈接到我的博客)。我們來舉一個Object.create方法的例子,如下所示。

var Logger = { log : function(log){} } 
var ConsoleLogger = function() {}; 
ConsoleLogger.prototype = Object.create(Logger); 
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!