5

ı Oyuncu nesnesi var diyelim: O inşaat büyükJS Prototip Kalıtım: Childs aynı ebeveyn özelliklerini kullanıyor mu?

var player = function(name) { 
    this.handlers = {}; 
} 

player.prototype.on = function(event, callback) { 
    if (!this.handlers[event]) { 
     this.handlers[event] = []; 
    } 
    this.handlers[event].push(callback); 
} 

, ben oyuncuları oluşturabilir ve her işleyicileri kendi kümesine sahip olacaktır. Şimdi player devralan gerekir varsayalım:

var testPlayer = function(name) { 
    this.name = name; 
}; 

testPlayer.prototype = new player(); 

Şimdi testPlayer 'ler oluştururken, bunların her biri aynı handlers özelliği paylaşmaktadır:

var adam = new testPlayer('Adam'); 
adam.on('test', function(){}); 

var eve = new testPlayer('Eve'); 
// eve.handlers == {'test':<function>} 

Burada ne eksik? Anladığım kadarıyla her testPlayer modelinin prototipi, çocuk sınıfını tanımlarken oluşturduğum new player nesnesi. Ancak tüm testPlayers'ın kendi işleyicileri için bir yolu var mı?

cevap

5

Bu, klasik kalıtım için kullanılanlar için tuhaf görünüyor, ama prototip kalıtımın nasıl işlediği. Örnek başına ayrı bir işleyici nesnesine sahip olmak için, alt yapıcıda bir tane belirtmeniz gerekir. Aynı adı taşıyan prototip özelliği gölge olacaktır:

var testPlayer = function(name) { 
    this.name = name; 
    this.handlers = {}; 
}; 

testPlayer.prototype = new player(); 

Başka bir çözüm sizin on yönteminden, on-demand bu gölgelendirme özelliği oluşturmak olacaktır:

player.prototype.on = function(event, callback) { 
    // Check for a handlers property on the instance 
    if(!this.hasOwnProperty('handlers') { 
     this.handlers = {}; 
    } 
    if (!this.handlers[event]) { 
     this.handlers[event] = []; 
    } 
    this.handlers[event].push(callback); 
} 

İlginç aslında

Bu, yalnızca bir nesnenin (veya dizinin) özelliklerini prototip üzerinde değiştiriyorsanız sorun olur. Prototipte yaşayan özelliklere atamayı denerseniz, otomatik olarak bir yerel gölgeleme özelliği oluşturulur (örneklerden prototip özelliklerine atayamazsınız).

+1

+1, bu en kullanışlı gibi görünüyor. –

+0

Katılıyorum, bu tamamen geçerli bir programlama paradigması. Sinir bozucu kısım, "handlers" kullanan her yönteme böyle bir kontrol eklemeniz gerektiğidir. – MaxArt

+0

Yapıcıdan tek bir 'init 'yöntemi çağrılabilir ve oradan da yapabilirsiniz. Bu, yalnızca bir nesnenin (veya dizinin) özelliklerini prototip üzerinde değiştiriyorsanız bir sorun olduğunu unutmayın. Prototipte yaşayan özelliklere atamayı denerseniz, otomatik olarak bir yerel gölgeleme özelliği oluşturulur (örneklerden prototip özelliklerine atayamazsınız). – bfavaretto

1

Buradaki sorun handlersyapıcı yılında eklenen bir özelliktir, bu nedenle

testPlayer.prototype = new player(); 

yaptığınızda testPlayer.prototype yepyeni player nesnenin her özelliğini ekliyor ve bu konum olmasıdır ,handlers içerir.

Yani, her testPlayer nesnede bir handlers mülkiyet var ve sen handlers Bir mülkü eklediğinizde testPlayer nesnenin prototip nesne mülkü ekleme ve değiliz. Kısacası

, sen testPlayer.prototype.handlers değil adam.handlers veya eve.handlers Bir mülkün ekliyoruz on yöntemi çağrılırken.

güvenli olması için, define: "Başka çözüm"

var testPlayer = function(name) { 
    this.name = name; 
    this.handlers = {}; 
}; 
İlgili konular