V minulém článku o JAK sem shrnul základní metody a mechanismy, které se hodí každému programátorovi. JavaScript je však jazyk objektový, a i JAK je na objektech založen. Jak se s objekty a jejich třídy pracuje, se pokusím vysvětlit v tomto článku.
20.1.2011 00:00 | Ondřej Tůma | přečteno 12310×
var Terorist = JAK.ClassMaker.makeClass({V kódu je vidět jak se definuje třída pomocí ClassMakeru. Parametry metody makeClass jsou název a verze třídy. Na dalším řádku je vidět definice statické proměnné. Ta je sdílená napříč všemi instancemi třídy. Dynamická proměnná (tedy lokální pro každou instanci) je přístupná přes operátor this. Přístup do paměti takové proměnné je copy_on_write, tedy vlastní skutečná kopie proměnné nastává až v okamžiku zápisu přes this. Zápis přes Trida.prototype mění statickou hodnotu, kterou uvidí všechny instance které si nevytvořili vlastní kopii zápisem.
NAME: "Terorist",
VERSION: "1.0"
});
Terorist._counter = 0; // statická proměnná
Terorist.prototype.name = ''; // dynamická proměnná
Terorist.prototype.$constructor = function(name){
this.name = name;
Terorist._counter++;
}
Terorist.prototype.$destructor = function(){
Terorist._counter--;
}
Terorist.prototype.talk = function(){
document.write('My name is ' + this.name + ', the ' + this.constructor.NAME);
document.write('. I kill you !
');
}
var ahmed = new Terorist('Ahmed');
ahmed.talk();
document.write('Count of Terorists: '+ Terorist._counter+'
');
var Bomberman = JAK.ClassMaker.makeClass({
NAME: "Bomberman",
VERSION: "1.0",
EXTEND: Terorist
});
Bomberman.prototype.$constructor = function(name, bombs){
this.$super(name);
this.bombs = bombs;
}
Bomberman.prototype.$destructor = function(){
document.write('BUM !!
');
this.$super();
}
Bomberman.prototype.talk = function(){
Terorist.prototype.talk.call(this); // totéž co this.$super();
document.write('I kill you all with my ' + this.bombs + ' bombs.
')
}
var mushafa = new Bomberman('Mushafa', 2);
mushafa.talk();
mushafa.$destructor();
var Hacker = JAK.ClassMaker.makeInterface({
NAME: "Hacker",
VERSION: "1.0",
});
Hacker.prototype.hack = function(){
document.write('Your PC is hacked, cha cha chaaaa!
');
};
var eTerorist = JAK.ClassMaker.makeClass({
NAME: "eTerororist",
VERSION: "1.0",
EXTEND: Terorist,
IMPLEMENT: [Hacker]
});
var farad = new eTerorist('Farad');
farad.hack();
farad.talk();
// Singleton
var BinLadin = JAK.ClassMaker.makeSingleton({
NAME: "BinLadin",
VERSION: "1.0",
EXTEND: Terorist
});
BinLadin.prototype.$constructor = function(){
this.$super(this.constructor.NAME);
}
BinLadin.prototype.talk = function(){
document.write("I'm "+this.name+'. ');
document.write('America must be destroyed !!
');
}
BinLadin.getInstance().talk();
//new BinLadin(); // končí s chybou
// Static
var Zero = JAK.ClassMaker.makeStatic({
NAME: "Zero",
VERSION: "1.0"
});
Zero.value = 0;
console.log(Zero.value);
//new Zero(); // končí s chybou