2013-07-21 3 views
0

미안하지만 미안하지만 초보자입니다. Javascript에서는 클래스 자체의 생성물을 사용하여 이미 정의 된 객체 클래스를 확장하는 가장 좋은 방법은 무엇입니까? 예를 들어, 일부 속성 및 메서드가 내장 된 클래스 Sprite이 있다고 가정합니다. 나는 여분의 속성을 갖고 싶습니다. Sprite.positionposition 부분은 두 개의 속성 position.xposition.y을 가진 클래스입니다. 그리고 그것은 하나의 인스턴스가 아니라 클래스 Sprite (과거와 미래)의 모든 인스턴스를 적용하기를 원합니다. position이 간단한 입력 데이터 (숫자 또는 문자열)이면 Sprite.prototype.position='there'을 쓸 수 있습니다. 또한 position 배열했다면 그것은 쉬웠을 것이다 : 그냥 Sprite.prototype.position="there", 또는 심지어 배열 배열을 이런 식으로 쓸 것이라고 ... 그러나 만약 position 클래스의 경우? 일반적으로 "클래스"를 구축하는 하나의 객체 생성자를 사용합니다 :자바에서 이미 정의 된 클래스에 서브 클래스 프로토 타이핑

function position(x,y) { 
    this.x = x; 
    this.y = y; 
} 

을하지만 그때 나는 var myPosition = new position(0,0);으로 position 객체를 인스턴스화해야하지만 위치 객체가 나는 새로운 Sprite 객체를 생성 할 때마다 존재합니다. 내가 Sprite.prototype.position=new position(0,0);을 쓰는 것이 문제가되는 경우 : mySprite1.position.x=2을 정의하면 2 값은 Sprite 클래스의 모든 속성 중 position.x 속성에도 지정됩니다. 이 명령은 Sprite.prototype.position='there' 명령으로 발생하지 않습니다.이 경우 모든 istance는 자신의 별도 값을 보유하게됩니다. 별도의 독립적 인 "위치"객체를 사용하여 모든 기능을 원합니다.

쉬운 선형 방식으로 원하는 것을 할 수 있습니까?

+0

은'Sprite' 생성자에서'Position'의 새로운 인스턴스를 생성하는 잘못은 무엇? 좋은 접근 방법 같아. – elclanrs

+0

* "position이 배열 인 경우에도 간단합니다. 단지'Sprite.prototype.position = [0,0]'"라고 쓰십시오. * Sprite.prototype.position = new SomeClass();와 똑같습니다. '두 경우 모두 ** 모든 ** Sprite 객체는 ** 동일한 ** 배열 또는 객체를 나타냅니다. 그래서 당신의 예제에서'sprite1.position [0] = 2;'는'sprite1.postion === sprite47.position' 때문에'sprite47.position [0]'은 이제'2'라는 것을 의미합니다. –

+0

* "... 왜냐하면'sprite1.postion === sprite47.position' ..."* 글쎄, 만약 내가'postion'에서 처음'i'를 놓치지 않았다면 말입니다. ;-) –

답변

1

그리고 하나의 인스턴스가 아닌 Sprite (과거 및 미래) 클래스의 모든 인스턴스를 적용하고 싶습니다.

당신은 당신이 (당신의 "testing" 문자열 등) 원시적 다루고 있다면, 그들 사이의 크로스 토크없이 모든 Sprite 객체에 그냥 Sprite.prototype에 추가 할 수 있으며,이 나타나는 것을 확실히 맞다. 위치가 쉽게했을 배열 인 경우도

:이 배열은 모든 Sprite 객체에 표시 것이 사실이지만 단지 Sprite.prototype.position=[0,0]

쓰기, 그들은 크로스 토크의 가능성을 것 그들은 모든 공유 같은 배열 거라고 때문에 : 당신이 그들을 같은 배열/객체를 공유하는 모든 신경 쓰지 않는 경우

var sprite1 = new Sprite(); 
var sprite2 = new Sprite(); 
Sprite.prototype.position = [0,0]; 
sprite1.position[0] = 42; 
console.log(sprite2.position[0]); // "42" 

, 당신과 똑같은 일을 할 수 있습니다 클래스 : 다시

Sprite.prototype.position = new Position(/*...*/); 

, 그들은 모든 주 하나Position 객체입니다.

  1. 할당하는 Sprite 생성자를 수정 : 각 스프라이트 인스턴스가 다른 인스턴스에 하나의 독립의 자신의Position 객체 (또는 배열)을 갖고 싶어

    , 당신은 두 가지 선택이 객체/배열이 만들어 질 때 인스턴스에 추가됩니다.

  2. 모든 Sprite 개체를 통해 스핀하고 개체/배열을 추가하십시오.

분명히 그 개체에 대한 참조가없는 한 # 2 할 수 없습니다.


그것은 잘 당신이 position을 가지고 있지 스프라이트를 처리하는 방법에 따라 전혀 Sprite.prototype에 아무것도하지 않아도 될 수 있습니다. 예를 들어 :

var x = sprite.position && sprite.position.x; 

스프라이트가 아직 위치가없는 경우 당신에게 undefined을 줄 것이다 :

function doSomethingWithASprite(sprite) { 
    if (!sprite.position) { 
     // Doesn't have a position yet, give it one 
     sprite.position = new Position(/*...relevant args...*/); 
    } 
} 

마찬가지로, 에 원하는 시간 스프라이트의 위치를 ​​얻는다.


당신을 위해 마지막 옵션 : 기능 position합니다

Sprite.prototype.position = function(x, y) { 
    // Make sure we have a position 
    if (!this.position) { 
     this.position = new Position(/*...relevant args...*/); 
    } 

    if (typeof x === "undefined") { 
     // Getter, return the current position 
     return this.position; 
    } 
    else { 
     // Setter, set the current position 
     this.position.x = x; 
     this.position.y = y; 
    } 
}; 
+0

고맙습니다. 특히 클래스가 큰 라이브러리에 속해있는 경우에는 다소 저조합니다. 수업을 연장하지 않고 동일한 결과를 모방하는 다른 전략이 있습니까? 어쩌면 객체 대신 "포인터"를 붙일 수 있습니까? –

+0

@Marco : 음, 객체를 첨부하면 포인터 (참조)가 첨부됩니다. 나는 슬프게도 위의 두 가지 이외의 대안을 생각해 내지 못하고 있습니다. –

+0

'Spite.prototype.position = "positionName"'을 정의하고 클래스 (position) 클래스의 특정 인스턴스 이름 인 "myPosition1"과 같은 문자열을 (모든 인스턴스에 대해) 채 웁니다. –

관련 문제