2013-05-02 3 views
1

JavaScript로 작성된 체스 게임에서 일하고 있습니다. 나는 객체 지향 접근 방식을 취하고 있으며 자바 스크립트의 상속에 대한 작업에 어려움을 겪고있다. 나는이 부분이 흑색인지 백색인지 같은 기본적인 필드 나 기본 getters/setter를 가진 "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 생성자 등에서 색상, 유형을 지정해야합니다 있도록

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

그러나, 이것은 Piece (슈퍼) 생성자에게 새 Pawn 인스턴스화 할 때마다 호출하지 않습니다

- 편집 -

당신이 대신 선호 할 수

: Javascript inheritance: call super-constructor or use prototype chain? 당신이 OBJ을하고자하는 경우

0

JS에서의 ect 지향적 인 접근 나는 파워 생성자 패턴을 따르는 것이 좋다.

기본적으로 개체를 만드는 기능이 있으며 내부 속성 (필드 또는 메서드)을 숨기려면 클로저를 활용하십시오.

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

    that.myPublicMethod=function(){ 

    } 
    return that; 

    } 

그러면 myObject() 메서드를 호출하면이 유형의 새 개체를 얻을 수 있습니다.

다른 객체의 power 생성자를 호출하고 객체 증가를 사용하여 상속을 사용하도록이 예제를 확장 할 수 있습니다. Douglas Crockford의 parasatic inheritance의 예를 살펴보십시오. 당신은 Pawn에서 Piece의 생성자를 호출하고 생성자를 가질 수

0

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! 
관련 문제