0

JavaScriptを使用して小さなゲームを書きたいのです<canvas>が、最初に、オブジェクトを操作するための「正しい」または少なくとも一般的なアプローチを明確にしたいです。

特に理解に苦労しているトピックの1つはoverriding、メソッドの実装方法です。

オブジェクトを作成するとき、私はこれを持っているかもしれません:

function MyObject()
{
    var base = {};

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

   return base;
}

次に、同じメンバーで始まる別のオブジェクトを作成するときに、これを使用します。

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

    base.j = 0;

    return base;
}

AnotherObject.update()私が持っているロジックを実行しながら、さらにコンテンツを追加したいのですMyObject.update()が、これを内で行うとAnotherObject()

base.update = function()
{
    j ++;
}

その後、もちろん、で追加したロジックは失われMyObject.update()ます。

で定義されAnotherObject.update()た元のメソッドも呼び出すようにするにはどうすればよいですか?update()MyObject

4

4 に答える 4

2

まず、この優れた優れた MDN 記事を読むことをお勧めします。それはあなたを啓発します。

この方法でサブクラス化を実現できます。

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
于 2012-05-08T04:48:49.087 に答える
0

+1 zzzzBov のコメント。baseを使用すべきときに使用していprototypeます。コンストラクター関数内ではなく、コンストラクター関数の後で、クラス定義をさらに絞り込みます。

于 2012-05-08T04:44:31.693 に答える
0
function MyObject() {
    this.value = 5;
}
MyObject.prototype.update = function() {
     this.value++;
}
Var newObject = new MyObject();
newObject.update =function() {
    value--;
}
于 2012-05-08T04:52:17.813 に答える
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(); 
于 2012-05-08T04:54:51.787 に答える