2013-05-02 4 views
1

Я работаю над шахматной игрой, встроенной в JavaScript. Я отношусь к объектно-ориентированному подходу, и мне сложно работать с наследованием JavaScript. Я хочу, чтобы был абстрактный класс «Piece», который содержит некоторые поля и базовые геттеры/сеттеры, такие как черный или белый. Затем я хочу иметь классы для каждого типа кусок, который я можно создать экземпляр так:Как расширить класс в 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; 
}; 

Я знаю, что если я собираюсь сделать подкласс для каждого вида кусок, который я бы, вероятно, исключить поле «тип», но как я мог бы сделать пешки подкласс? Что-то вроде этого?

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 конструктора:

- EDIT -

вы могли бы предпочесть вместо этого: Javascript inheritance: call super-constructor or use prototype chain?

0

Если вы готовы принять OBJ ect ориентированный подход на JS Я бы рекомендовал вам следовать шаблону конструктора мощности.

В принципе у вас есть функция, которая создает для вас объекты и использует преимущества закрытия, чтобы скрыть внутренние свойства (поля или методы).

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

    that.myPublicMethod=function(){ 

    } 
    return that; 

    } 

Тогда вы можете просто вызвать метод myObject(), и вы получите новый объект этого типа.

Вы можете расширить этот пример, чтобы использовать наследование, просто вызвав конструктор мощности другого объекта, а затем используйте расширение объекта. Взгляните на пример parasatic inheritance Дугласа Крокфорда.

0

Вы можете вызвать конструктор Piece «s из 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! 
Смежные вопросы