Da skratimo uvertiru,
ono što bi bilo zanimljivo, čini mi se, svima koji znaju lepo da rade u JS-u ili se bar trude, jeste prezentacija (dobri i validni primeri) načina uz pomoć kojeg nadomešćujemo nedostatak JS namespace-a.
Kod mene to ide ovako nekako, `tehnika` se sastoji iz dva ili tri dela, zavisi.
Html head tag, prvi deo. Tu je dinamički deo, inline script tag (uvek), svojstva generiše PHP. Ovaj deo sadrži svojstva, stringove, integere, dinamičke nizove.. eventualno getElement(s)by* .. koje ume da se ponovi xxx puta. Mada, to je moje nepisano pravilo, navika.
Code (javascript):
/* <script type="text/javascript"> */
function miniFwName() {
// Primer svojstava
this.propertyOne = 'PropertyOne Value';
this.propertyTwo = 'PropertyTwo Value';
// Primer funkcije kao svojstva
// eg: document.getElementsByClassName('klasa')[0]
this.CNAME = function(a,b) { return(a.getElementsByClassName(b)[0]); };
// itd, itd..
}
/* </script> */
/* <script type="text/javascript"> */
function miniFwName() {
// Primer svojstava
this.propertyOne = 'PropertyOne Value';
this.propertyTwo = 'PropertyTwo Value';
// Primer funkcije kao svojstva
// eg: document.getElementsByClassName('klasa')[0]
this.CNAME = function(a,b) { return(a.getElementsByClassName(b)[0]); };
// itd, itd..
}
/* </script> */
Tik pre zatvaranja body taga, drugi deo, glavni deo. Prvo svojstvo kreiranog objekta jeste zapravo prvi html/head inline deo. Property `0`. Sve ostalo su funkcije - `metode`. Opet, moje nepisano pravilo i navika povodom redosleda.
Code (javascript):
/* <script type="text/javascript" src="miniFwName.js" charset="utf-8"> */
var miniFwName = ((typeof(miniFwName) !== "function" || miniFwName instanceof Function === false)
? new String("Warning: miniFwName should not be String Object!")
: Object.create({
0: new miniFwName(),
funcName1: function() {
alert('YabaDabaDooYa!');
},
funcName2: function(a,b,c) {
/* ... */
},
init: function () { return; }
}));
/*
Treći deo..
U zavisnosti od toga treba li biti generisan dinamički ili ne,
nalazi se u samom html dokumentu, dakle još jedan script tag nakon `src-ovanog`
ili u sklopu priključenog drugog dela, na samom kraju.
Sadržina završnice je poprilično jasna, zar ne?
*/
if (miniFwName instanceof String) {
if (typeof(window.console) === undefined)
throw new ReferenceError(miniFwName);
else console.log(miniFwName);
} else {
document.onreadystatechange = function () {
if (document.readyState === 'complete')
miniFwName.init();
};
}
/* <script type="text/javascript" src="miniFwName.js" charset="utf-8"> */
var miniFwName = ((typeof(miniFwName) !== "function" || miniFwName instanceof Function === false)
? new String("Warning: miniFwName should not be String Object!")
: Object.create({
0: new miniFwName(),
funcName1: function() {
alert('YabaDabaDooYa!');
},
funcName2: function(a,b,c) {
/* ... */
},
init: function () { return; }
}));
/*
Treći deo..
U zavisnosti od toga treba li biti generisan dinamički ili ne,
nalazi se u samom html dokumentu, dakle još jedan script tag nakon `src-ovanog`
ili u sklopu priključenog drugog dela, na samom kraju.
Sadržina završnice je poprilično jasna, zar ne?
*/
if (miniFwName instanceof String) {
if (typeof(window.console) === undefined)
throw new ReferenceError(miniFwName);
else console.log(miniFwName);
} else {
document.onreadystatechange = function () {
if (document.readyState === 'complete')
miniFwName.init();
};
}
Nakon ovoga, dobili smo miniFwName JS Objekat koji recimo, na `miniFwName[0].propertyOne` daje: 'PropertyOne Value'
... ili `alertuje` na miniFwName.funcName1(), itd..
Koliko je dobro deklarisati neku vrstu "namespace"-a na ovaj način, ne znam.
Object.create metoda, rekao bih - tek će da ima neku vrstu, da kažem popularnosti (moja procena).
Čini mi se najmoćniji način za object oriented JS (bez obzira što je u JS-u gotovo sve O.O.).
Da li je closure fazon bolji, ni to ne znam.
Ono što znam, jeste da je ovaj način, pa onako.. :D malčice grub kada je u pitanju backward compatibility (ranije verzije internet explorera), mora i prototypinga malo, makar za IEv8.
I ono što takođe znam, jeste da svi - normalni - pretraživači nemaju ama baš ništa protiv ovakve prakse.
-----------
Toliko od mene za sad.
Ko god je voljan/voljna da opiše svoj lični, omiljeni način za `hendlovanje` NS-a u JS, neka se ne ustručava.
about:networking