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:

Przyklad:


Zostaw odpowiedz