[ plus_minus @ 28.06.2015. 03:52 ] @
JS developera je puno danas. Ima ih/nas k'o buba rusa. Ja sam takođe jedan iz tog lonca. Delimično makar, jer mi JS nije primarna stvar, ali, obrni/okreni, uz PHP, JS mu dođe praktično nezaobilazna igračka. Po nekom ECMA standardu, bar koliko sam ja upućen, JS nema namespace. Što je malčice bzvz, ako mene pitate. Zapravo, u JS-u ne postoji nešto kao namespace Stellar; (tipičan PHP način), ali postoje načini da se JS kod načini unikatnim, tako da neka druga skripta koja dođe na red nakon glavne, ne pregazi svojim nazivima postojeće funkcije ili objekte koji su nam važni. Do sada sam ispisao dosta JS koda, `from scratch` što bi rekli, native JS, nema first/second/third-party libova, itd... itd. kada se radi o sajtu i opštoj funkcionalnosti sajta. I tako uvek. Normalno, kada na red dođe da se ofarba kod ili textarea preuredi u funkcionalni tekstualni editor, nisam toliko lud da svaki put pišem skripte od `16 kilometara` from scratch, nego integrišem ace ili codemirror ili nešto što sam već napisao, šta god to bilo. Ali, kada je u pitanju nešto što samo po sebi - ne sme - i ne treba/nema smisla da bude gabaritno, to je već posao za završiti, ručno. Nekako se bolje osećam sa jednim svežim self-made urađenim JS objektom/metodama koji sve odradi savršeno, umesto jQuery min.. 12.. 45... 175.. itd .. malo karikiram, ali to mu je to.

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> */
 


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();
     };
     
}

 


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.
[ agvozden @ 28.06.2015. 11:32 ] @
Pisem sve vise JS koda, uglavnom praktikujem jquery. Radim dosta sa ajax-om, pa mi jquery dodje najprakticniji za to.
Plaginove radim kao objekte, onda nema problema sa nazivima funkcija, osim sa nazivima plagina.
U ostatku koda koristim funkcije sa dugackim imenom, pa mi nikada nije ni trebao neki namespace.

Ipka, interesantna mi je tema, pa cu pratiti, pasivno ili aktivno...