Powiedzmy mam obiekt gracza:JS Prototypal Inheritance: childs używają tych samych właściwości rodzica?
var player = function(name) {
this.handlers = {};
}
player.prototype.on = function(event, callback) {
if (!this.handlers[event]) {
this.handlers[event] = [];
}
this.handlers[event].push(callback);
}
Działa świetnie, mogę tworzyć graczy i każdy będzie miał swój własny zestaw ładowarki. Załóżmy teraz, że muszę dziedziczą player
:
var testPlayer = function(name) {
this.name = name;
};
testPlayer.prototype = new player();
teraz, gdy tworzę testPlayer
„s, a każdy z nich podziela tą handlers
właściwość:
var adam = new testPlayer('Adam');
adam.on('test', function(){});
var eve = new testPlayer('Eve');
// eve.handlers == {'test':<function>}
Co ja tu brakuje? Rozumiem, że każdy prototyp testPlayer
jest tym samym obiektem, który utworzę podczas opisu klasy potomnej. Ale czy istnieje jakiś sposób, aby wszystkie testPlayery miały swój własny zestaw procedur?
+1 do "innego rozwiązania", to wygląda jak najbardziej użyteczny. –
Zgadzam się, to całkowicie poprawny paradygmat programowania. Denerwujące jest to, że musisz dodać taką kontrolę w każdej metodzie, która używa 'obsługi". – MaxArt
Możesz mieć pojedynczą metodę 'init' wywołaną z konstruktora i zrobić to z tego miejsca. Zauważ, że jest to problem tylko wtedy, gdy modyfikujesz właściwości obiektu (lub tablicy) na prototypie. Jeśli spróbujesz przypisać do właściwości, które znajdują się na prototypie, lokalna właściwość shadowowania zostanie utworzona automatycznie (nie można przypisać do właściwości prototypu z instancji). – bfavaretto