2012-12-07 12 views
7

Possible Duplicate:
set attribute with javascript super methodはサブクラスからスーパークラスのメソッドを呼び出す - JavaScriptの

私は楽しみのためにHTML5で簡単なゲームを作成しようとしています。私はPlayerクラスのスーパークラスであるはずのEntityクラスを持っています。

function Entity(x, y) { 

    this.x = x; 
    this.y = y; 

    this.tick = function() { 
     //Do generic stuff 
    } 
} 

function Player(x, y) { 

    this.parent.constructor.call(this, x, y); 

    this.tick = function() { 
     //Do player-specific stuff 
     this.parent.tick.call(this); 
    } 
} 

Player.prototype = new Entity(); 
Player.prototype.constructor = Player; 
Player.prototype.parent = Entity.prototype; 

問題は、このラインである:「:未定義の 『と呼ぶ』メソッドを呼び出すことはできませんキャッチされない例外TypeError:」

this.parent.tick.call(this); 

私はクロームのJavaScriptコンソールに表示されたエラーを取得します。

私はそれを得ることはできません。私は似たような問題の投稿を見つけるのに長い時間を費やしました。スーパークラスのコンストラクタへの呼び出しは正常に動作しますが、スーパークラスのtickメソッドへの呼び出しは機能しません。

私はこれが良いセットアップ(サブクラスのティックからスーパークラスのティックを呼び出す)であるかどうかわからないので、ゲームを作るのはとても新しいです。人々が使うより良い、より典型的な方法があれば、教えてください。

ありがとうございました。

+0

プロトタイプに一般的なものがないのはなぜですか?そこに簡単にアクセスできます。 – Bergi

+0

javascriptにはjavaなどの他の古典的な言語から使用されているような古典的な継承はありません。プロトタイプの継承を読んで、古典的な相違点について学ぶ必要があります。 – Christoph

答えて

7

コードにthis answerを適応:

function Entity(x, y) { 

    this.x = x; 
    this.y = y; 

    this.tick = function() { 
     //Do generic stuff 
    } 
} 

function Player(x, y) { 

    this.parent.constructor.call(this, x, y); 

    var oldtick = this.tick; 
    this.tick = function() { 
     //Do player-specific stuff 
     oldtick.call(this); 
    } 
} 

Player.prototype = Object.create(Entity.prototype); 
Player.prototype.constructor = Player; 
Player.prototype.parent = Entity.prototype; 
+0

私は疑いがあります。なぜthis.parent.constructor.call(this、x、y); 'に' this 'を渡す必要があるのですか?まあ私は知っている、これはこのように動作します。しかし、私はこれについて何の説明も見つけられません。 –

+0

@VeerShrivastav:インスタンスを渡す必要があります。そうしないと、コンストラクタはプロパティを設定する場所を知らないためです。 – Bergi

4

あなたの質問は周りを見て私にインスピレーションを得たと私はこのコンセプトについてa great article by Josh Gertzenと思われるものを発見しました。その後、Player tickとを警告する

var Entity = Class.extend({ 
    tick: function() 
    { 
     alert('Entity tick'); 
    } 
}); 

var Player = Entity.extend({ 
    tick: function() 
    { 
     alert('Player tick'); 
     arguments.callee.$.tick.call(this); 
    } 
}); 

p = new Player(); 
p.tick(); 

:あなたの場合は、のように単純である後

function Class() { } 
Class.prototype.construct = function() {}; 
Class.extend = function(def) 
{ 
    var classDef = function() 
    { 
     if (arguments[0] !== Class) 
     { 
      this.construct.apply(this, arguments); 
     } 
    }; 
    var proto = new this(Class); 
    var superClass = this.prototype; 
    for (var n in def) 
    { 
     var item = def[n];      
     if (item instanceof Function) item.$ = superClass; 
     proto[n] = item; 
    } 
    classDef.prototype = proto; 
    classDef.extend = this.extend;  
    return classDef; 
}; 

私は露骨に彼の記事のクラスにextends方法を設定するにはいくつかのコードからコピーしますEntity tick

+10

Bergiの回答はより洗練されていますが、努力のために、私には過多のように見えます:-) – Bergi

+0

+1。 – WTK

+2

これがアプリケーション内の唯一のスーパークラス呼び出しであれば、それはもちろん複雑すぎます。しかし、私はコードの2番目のブロックが他の方法よりもはっきりしていることがわかりました。そして、最初のブロックを一度コピーして貼り付けてから忘れてください。プロトタイプについてはもう考えません:-) – Mark

関連する問題