2014-11-14 5 views
0

나는 직접적인 대답은 여기 없다고 알고 있지만, 가능하다고 생각하는 부부와 이야기를 나눴습니다. 여기 내 코드는 다음과 같습니다.이미 다른 클래스에서 상속 한 클래스를 확장 할 수 있습니까?

var Tile = function(xPos, yPos, state) { 
    this.createTile(xPos, yPos, state); 
} 

Tile.prototype = new createjs.Shape(); 

Tile.prototype.createTile = function(xPos, yPos, state) { 
    // debugger; 
    this.x = xPos; 
    this.y = yPos; 
    this.onState = state; 

    var fillCommand = this.graphics.beginFill("#969696").command; 
    var shapeCommand = this.graphics.drawRoundRect(0, 0, 50, 50, 10).command; 

    this.on("click", function(){this.toggleState(fillCommand);}); 

    stage.addChild(this); 
    stage.update(); 
} 

Tile.prototype.toggleState = function(fillCommand) { 
    if (this.onState === true) { 
     fillCommand.style = "#969696"; 
     stage.update(); 
     this.onState = false; 
     } else if (this.onState === false) { 
     fillCommand.style = "#000000"; 
     stage.update(); 
     this.onState = true; 
    } 
} 

누구나 익숙하다면 Shape()가 easeljs에 구현됩니다. 기본적으로 여기에 Tile 클래스를 만들어서 눌렀을 때 색상이 바뀌는 작은 둥근 사각형을 나타냅니다. 구문 - 현명한 웹 페이지에 아무것도 표시되지 않습니다. 이미 타일을 호출하고 캔버스가 이미 설정되어있는 올바른 코드가 있거나이 코드도 여기에 넣습니다. 내가 여기서 묻는 것은,이 구현에서 올바른 생각을 가지고 있는가?

+1

왜 직접 응답이 "아니오"입니까? 이것은 평범한 자바 스크립트 상속과 같습니다. change만이'createjs.Shape.call (this)'과 같은'Tile' 생성자 안에서'Shape' 생성자를 호출 할 수 있습니다. 또한,'Tile.prototype = Object.create (createjs.Shape.prototype)'이 일반적으로 선호됩니다. –

+0

나는 자바 스크립트가 오직 하나의 상속만을 지원한다는 것을 알고있다. 그래서 나는 직접적인 대답이 아니오라고 말했다. 잘못인가? –

답변

1

다소 개성이 없지만 그것이 효과가 있다면 당신에게 더 많은 힘을줍니다. 모양에서 상속하는 일반적인 방법은 자바 스크립트에서

Tile.prototype = Object.create(createjs.Shape.prototype); 
Tile.prototype.constructor = Tile; 

상속과 같은 일을 할 것입니다 당신이 깊은 토끼 구멍 아래로 이동하는 시간과 에너지를하지 않는 한, 난 그냥 고집 추천 할 것입니다, 그래서 조금 이상하다 무슨 일이야. 더 읽기를 좋아한다면이 기사를 통해 시작해 보겠습니다. http://ejohn.org/blog/simple-javascript-inheritance/

+0

+1 _JavaScript_에서 프로토 타입 상속을 설정하는 가장 깨끗한 방법입니다. _function_'Tile' 어딘가에 'createjs.Shape.call (this, foo, bar, baz 등);'과 같은 것을 사용할 수도 있습니다. 필요에 따라 –

+0

글쎄 내 문제는 그것이 나에게 오류를 완전히주지는 않는다는 것이다. 그러나 그것은 표시되지 않는다. 그래서 나는 실제로 그것을 잘못하고 있다고 생각하고 있습니다. –

1

여기 EaselJS 기고자가 - 당신은 절대적으로 EaselJS 클래스를 확장 할 수 있습니다. 실제로는 tutorial on the EaselJS site이 있습니다. 다른 사람들이 언급했듯이 자바 스크립트 상속은 고통스럽고 반드시 최선의 접근법 일 필요는 없습니다. 예를 들어, 나는 항상 모양/스프라이트를 상속하지 않고 작성합니다. 그러나 이젤은 완전히 가능합니다. 이서엘 지에는 EventDispatcher > DisplayObject > Bitmap을 살펴보십시오.

예를 들어, 초기화를 무시하고 수퍼 클래스 버전이 호출되는지 확인하는 튜토리얼의 접근법을 사용해야 할 것입니다. 약간 더러 웠지 만 EaselJS 0.7.1 (최신 릴리스)까지 광범위하게 사용되었습니다. .

새로운 방법 더 나은하지만

의 최신 버전 CreateJS (GitHub에서 NEXT 버전으로 만 사용 가능하며 곧 CDN에 태그를 지정하고 게시해야합니다!) 상속을위한 새로운 모델이 훨씬 쉽습니다. 자동으로 수퍼 메소드 삽입과 같은 작업을 수행합니다. 슈퍼 생성자.

function MyClass(arg) { 
    this.EventDispatcher_constructor(); 
    this.doSomethingWith(arg); 
} 
var p = createjs.extend(MyClass, createjs.EventDispatcher); 

// Add new methods 
p.doSomethingWith = function() { 
    // whatever 
} 

// Override methods 
p.addEventListener = function(name, listener) { 
    this.EventDispatcher_addEventListener(name, listener); 
    // custom stuff here 
} 

// Promote super class methods to MyClass 
window.MyClass = createjs.promote(MyClass, "EventDispatcher"); 

이 방법은 사용하기가 쉽고 청소기가 잘 작동합니다.

도움이 되길 바랍니다. :)

+0

다음은 CreateJS의 새로운 클래스 모델에 대한 발표입니다 : http://blog.createjs.com/new-createjs-class-model/ – Lanny

+0

코드 업데이트 행의 오류 'var fillCommand = this.graphics.beginFill ("# 969696").명령, ' 정의되지 않은'beginFill '속성을 읽을 수 없다는 뜻입니다. 클래스 구현으로 사용하는 이유는 결국 상태를 설정하거나 해제하기 위해 만들어지는 다른 타일을 추적하기 때문입니다. 이러한 타일은 기본적으로 생성되는 프리 패브입니다. 더 쉬운 구현은 내가하려고하는 클래스 모델을 사용하지 않을 것인가? –