2012-05-08 12 views
0

私はJavaScriptと<canvas>を使用して小さなゲームを書きたいと思いますが、最初に「正しい」または少なくとも共通のアプローチでオブジェクトを操作したいと思います。JavaScriptでの拡張/上書き?

トピックの1つ私は特に方法の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つの関数を作成します... –

関連する問題