2012-12-07 14 views
7

Possible Duplicate:
set attribute with javascript super method- JavaScript

Eğlence için HTML5 basit bir oyun oluşturmak çalışıyorum. Oyuncu sınıfının süper sınıfı olması gereken bir Varlık sınıfım var.

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; 

sorun bu satırda şudur: ": tanımsız bir 'çağrı' yöntemi arayamaz Yakalanmayan TypeError:"

this.parent.tick.call(this); 

Ben krom JavaScript konsolunda görüntülenen bir hata alıyorum.

Anlayamıyorum ve benzer bir sorunun yayınlarını bulmaya uzun zaman harcadım. Süper sınıfı 'yapıcısı için yaptığım çağrı gayet iyi çalışıyor ancak üst sınıf' çağrı yöntemini çalışmaz.

Oyunlar yapmak için çok yeniyim, bu yüzden bu iyi bir kurulum (alt sınıf kene listesinden üst sınıf arama işaretini çağırmak) konusunda hiçbir fikrim yok. İnsanların daha iyi, daha tipik bir yolu varsa, lütfen söyleyin.

Teşekkürler.

+0

Neden prototipte jenerik malzeme yok? Oraya kolayca erişebilirsin. – Bergi

+0

javascript'in java gibi diğer klasik dillerden kullanıldığı gibi klasik bir kalıtımı yoktur. Prototip mirasını okumalı ve klasik olana göre farklılıklarını öğrenmelisiniz. – Christoph

cevap

7

kodunuzu this answer uyarlanması:

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

Şüphem var. Neden bunu şu şekilde iletmemiz gerekiyor: 'this.parent.constructor.call (this, x, y);'. Eh biliyorum, bu böyle çalışır. ama bunun için herhangi bir açıklama bulamadım. –

+0

@VeerShrivastav: Örneği iletmeniz gerekir, aksi halde kurucu, özelliklerini nasıl ayarlayacağını bilemez. – Bergi

4

Sorunuz etrafa bakmak için bana ilham ve ben bu kavram hakkında a great article by Josh Gertzen olduğunu düşünüyorum bulundu. Sonra Player tick ve uyaracaktır

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(); 

: davanız kadar basittir ki sonra

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; 
}; 

:

Ben pervasızca yazısında sınıfları üzerinde bir extends yöntemi kurmak için bazı kod kopyalamak Entity tick.

+10

Bergi yanıtı daha temiz olmasına rağmen, çaba için bana çok fazla benziyor :-) – Bergi

+0

+1. – WTK

+2

Bu, uygulamadaki tek sınıf sınıfı çağrısı ise, bu, bir aşırı derstir. Fakat ikinci kod bloğunun diğer yöntemlerden daha net olduğunu görüyorum. Ve sadece ilk bloğu bir kez kopyalayıp yapıştırmanız ve sonra unutmanız gerekir; prototipler hakkında daha fazla düşünmüyorum :-) – Mark