2013-08-02 23 views
5

EaselJS kullanarak oyun yapıyorum ve demo dosyalarında kullanılan kalıtım modelinin nasıl çalıştığını birilerinin açıklayabileceğini merak ediyorum. Özellikle, aşağıdaki dosyaya bakıyorum: ... https://github.com/CreateJS/EaselJS/blob/master/examples/assets/Ship.js hattı 7 günüEaselJS: Birisi demolarda kullanılan kalıtım paternini açıklayabilir mi?

, Gemi prototip bir createjs.container() örneğine olarak ayarlanır

var p = Ship.prototype = new createjs.Container(); 

Ve sonra hat 28, bir referans üzerine orijinal yapıcı depolanır: Son olarak

p.Container_initialize = p.initialize; //unique to avoid overiding base class 

, Ship nesne hattı üzerinde başlatılır 30

p.initialize = function() { 
    this.Container_initialize(); 

Başımı bu desenin etrafına sarmaya çalışıyorum, çünkü geçmişte rastladığım bir şeyden farklı. Birisi bana neden bir sınıf örneğini yeni bir sınıf 'prototip olarak kullanmak isteyeceğinizi açıklayabilir mi? Belki de bana bu örüntüün bir açıklaması olan bir bağlantıya işaret eder misiniz? Burada herhangi bir yardım büyük beğeni topluyor ... Bu sorunun biraz belirsiz olduğunu anlıyorum.

+0

Bu yaygın bir desen var, burada öğretici kontrol https://developer.mozilla.org/ tr-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript – elclanrs

+0

Teşekkürler, bu soruya oldukça cevap veriyor. Spesifik olarak: "Uzmanlık sınıfı genellikle çocuk olarak adlandırılır ve diğer sınıf genellikle ebeveyn olarak adlandırılır. JavaScript'te bunu, ana sınıfın bir örneğini çocuk sınıfına atayarak ve sonra uzmanlaştırarak yapabilirsiniz. Modern tarayıcılarda Ayrıca devralma uygulamak için Object.create kullanın. " –

+0

Tüm bunları anlamak için en iyi seçiminiz, EaselJS için bir Typescript tanım dosyası. –

cevap

8

Başımı bu desenin etrafına sarmaya çalışıyorum, çünkü geçmişte karşılaştığım hiçbir şeye benzemiyorum.

Ben de. Çok fazla sihir yapmaz, ama yapısı kesinlikle nadirdir. Doğru desen için bkz. Correct javascript inheritance.

Birisi bana neden bir sınıf örneğini yeni bir sınıf 'prototip olarak kullanmak isteyeceğinizi açıklayabilir mi?

Yapmıyorsunuz. Ebeveyn sınıfının prototip nesnesinden miras alan bir nesneyi kullanmak istiyorsunuz. Unfortunately many people use new ParConstructor for that - Kurucu işlevi boşsa iyi çalışır. Kurucu örnek özellikleri oluşturuyorsa veya başka yan etkileri varsa, sorun yaratabilir. Yine de çoğu insan bunu fark etmiyor ya da önemsemiyor.

Bu desenin açıklaması?

function Ship() { 
    this.initialize(); 
} 

Bu sadece (bir kurucu olarak this) yeni duruma üzerinde initialize yöntemini çağırdığında

. Başlatma kodunu doğrudan yapıcıya yerleştirme konusunda herhangi bir fayda görmüyorum, ancak olabildiği kadar.

var p = Ship.prototype = new createjs.Container(); 

olarak bu Container "class" dan yöntemlerini miras prototip zincirini kuruyor, yukarıda açıkladı. Muhtemelen gereksiz örnek başlatma yapar, bu nedenle bir Object.create çağrısı ile değiştirilmesi gerekir. Ve prototip için bir kısayol değişkeni oluşturur.İşte

// constructor: 
p.Container_initialize = p.initialize; //unique to avoid overiding base class 

, ebeveynin yapıcısına açıkça referans oluşturulur. p üzerinde initialize mülkiyet Container prototipten miras olduğunu ve şimdi açıklayıcı bir adla p nesnenin kendi özelliği yapılır.

p.initialize = function() { 
    this.Container_initialize(); 
    … // property init stuff 

... Burada bir kendi initialize yöntem miras birini gölgeleme, prototip nesne üzerinde bildirilmiş ... Çünkü gereklidir. Yine de, "süper" başlatma kodu şimdi bu özel özellik kullanılarak geçerli örnek üzerinde çağrılabilir. Bunu yapmak quite common, ancak yöntemle bu şekilde değil. Bunun yerine, alt yapıyı alt öğe üzerinde uygulamak için call normal olarak kullanılır.

Daha İyi (en azından, daha tanıdık): initialize olmadan alternatif

function Ship() { 
    this.initialize(); 
} 

var super_p = createjs.Container.prototype, 
    p = Ship.prototype = Object.create(super_p); 

p.initialize = function() { 
    super_p.initialize.call(this); 
    … // property init stuff 

Veya:

function Ship() { 
    createjs.Container.call(this); 
    … // property init stuff 
} 
Ship.prototype = Object.create(createjs.Container.prototype); 
+0

Buna oy veriyorum ama yapabilmem için birkaç tane daha itibar puanına ihtiyacım var. Derinlemesine açıklama için teşekkürler! –

İlgili konular