Mar
6
2010
JS dziedziczenie i override’y
Niby nie ma formalnie klas w JS, jednak mozemy stworzyc cos co mimo braku podzialu na obiekty prywatne, publiczne itd, bedzie wygladalo na klasy.
Na poczatek stworzmy nasza “klase” bazowa
// konstruktor klasy BaseClass = function(name) { this.name = name || "obj_" + (new Date()).getTime(); }; BaseClass.prototype.className = "BaseClass"; // instancja klasy BaseClass var instanceOfBaseClass = new BaseClass();
w ten sposob mamy obiekt posiadajacy dwie wlasnosci name i className. Ta druga nie bedzie dziedziczona bezposrednio.
A teraz dziedziczenie.
DerivativeClass = function(name) { this.super = BaseClass; this.super(name); }; DerivativeClass.prototype = new BaseClass(); DerivativeClass.prototype.className = "DerivativeClass"; var instanceOfDerivativeClass = new DerivativeClass();
Po tym zabiegu instancja klasy DerivativeClass bedzie wygladac mniej wiecej tak
instanceOfDerivativeClass className = "DerivativeClass" name = "obj_1267912571913" super prototype className = "BaseClass"
Dzidziczenie? Jak najbardziej
Teraz sprobujmy nadpisac funkcje bazowa init, na poczatek dodajmy ja
BaseClass.prototype.init = function() { this.initialized = true; };
i do konstruktora
this.initialized = false;
tak docelowo powinna wygladac klasa bazowa
BaseClass = function(name) { this.name = name || "obj_" + (new Date()).getTime(); this.initialized = false; }; BaseClass.prototype.className = "BaseClass"; BaseClass.prototype.init = function() { this.initialized = true; };
Teraz w obiekcie DerivativeClass nadpiszemy ja w nastepujacy sposob
DerivativeClass.prototype.superInit = DerivativeClass.prototype.init; DerivativeClass.prototype.init = function() { // do something // a na koncu wywolaj this.superInit(); };
Dziala? Jasne, ze tak:
