2012-05-08 3 views
0

JavaScript 및 <canvas>을 사용하여 작은 게임을 만들고 싶지만 먼저 "올바른"또는 적어도 일반적인 방식으로 Object 작업을하고 싶습니다.JavaScript에서 확장/재정의 하시겠습니까?

하나의 주제 나는 특히 overriding 메서드를 구현할 수있는 방법을 이해하는 데 문제가 있습니다. 내가 개체를 만들 때

, 나는이있을 수 있습니다 :

function AnotherObject() 
{ 
    var base = new MyObject(); 

    base.j = 0; 

    return base; 
} 

내가 원하는 : 나는 같은 멤버로 시작해야 다른 개체를 만들 때

function MyObject() 
{ 
    var base = {}; 

    base.i = 0; 
    base.update = function() 
    { 
     base.i ++; 
    } 

    return base; 
} 

을 다음, 나는 이것을 사용 AnotherObject.update()에 콘텐츠를 추가하면서 내가 가지고있는 논리를 계속 실행하면서 MyObject.update()을 입력하면 AnotherObject() :

그럼 물론 내가 추가 한 논리를 잃어 버리는데 MyObject.update().

MyObject으로 정의 된 원래 update() 메서드를 호출하기 위해 AnotherObject.update()을 어떻게 쓸 수 있습니까?

+2

아래에 표시 할 수 있습니다. – zzzzBov

+1

@zzzzBov 실화. – Marty

답변

2

먼저이 우수한 excellent MDN article을 읽어 보시기 바랍니다. 그것은 당신을 계몽 할 것입니다.

이 방법을 서브 클래스 달성 할 수있다 : 다른 사람이 당신이 프로토 타입 기반 상속을 따라야 제안

function MyObject() { 
    this.i = 0; 
} 

MyObject.prototype.update = function() { 
    this.i++; 
} 

function AnotherObject() { 
    MyObject.call(this); 
    this.j = 0; 
} 

AnotherObject.prototype = new MyObject; 

AnotherObject.prototype.constructor = AnotherObject; 

AnotherObject.prototype.update = function() { 
    MyObject.prototype.update.call(this); 
    this.j++; 
} 

obj = new AnotherObject(); 
console.log(obj.i); //0 
console.log(obj.j); //0 

obj.update(); 
console.log(obj.i); //1 
console.log(obj.j); //1 

console.log(obj instanceof MyObject) //true 
console.log(obj instanceof AnotherObject) //true 
+0

첫 번째 할당 후에 속성을 추가하는 대신 'AnotherObject.prototype'을 할당 한 다음 다시 할당하십시오. 또한'B.prototype = Object.create (A.prototype)'은 거의 언제나'B.prototype = new A()'보다 바람직합니다 - http://javascript.crockford.com/prototypal.html –

+0

당신 말이 맞아요. 프로토 타입 부분, 그것을 편집했습니다. 'Object.create'도 바람직하지만 간단한 예제를 제공하고 싶습니다. –

0

+1 zzzzBov의 의견입니다. prototype을 사용해야하는 경우 base을 사용 중입니다. 생성자 함수 내에 있지 않고 생성자 함수 다음에 클래스 정의를 더 구체화합니다.

0
function MyObject() { 
    this.value = 5; 
} 
MyObject.prototype.update = function() { 
    this.value++; 
} 
Var newObject = new MyObject(); 
newObject.update =function() { 
    value--; 
} 
0

으로. 그것이 올바른 방법입니다.

그러나

는 지금까지 무엇을했는지에 대한 해결책으로 당신은 당신은 객체의 프로토 타입을 사용하는 방법을 배울 필요가

function MyObject() { 
    var base = {}; 
    base.i = 0; 
    base.update = function() { 
     this.i++; 
    } 
    base.show = function() { 
     console.log("i is " + this.i); 
    } 
    return base; 
} 

function AnotherObject() { 
    var base = new MyObject(); 
    base.j = 0; 
    var update = base.update; // proxy variable that refers to original `update` 
    base.update = function() { 
     update.call(this); // invoke original `update` 
     this.j++; 
    } 
    var show = base.show; // proxy variable that refers to original `show` 
    base.show = function() { 
     show.call(this); // invoke original `show` 
     console.log("j is " + this.j); 
    } 
    return base; 
} 

var t = AnotherObject(); 
t.update(); 
t.show(); 
+0

원래의 메소드에 대한 참조를 유지하는 방법을 아는 것이 감사합니다. – Marty

+0

프로토 타입 기반 상속을 사용하는 방법을 아는 것이 훨씬 도움이 될 것입니다. 이것은 정말로 좋지 않습니다. –

+0

프로토 타입 기반 상속을 실제로 배워야합니다. 이 방법은 비효율적입니다. AnotherObject 인스턴스 당 4 개의 함수를 생성합니다 ... –

관련 문제