Wednesday, August 06, 2008

JavaScript: Објектно ориентирани модули (отприлика)

Објектно ориентираните модули во JavaScript (првпат идентифицирани од Douglas Crockford), го користат фактот дека JS има само еден вид на опфат на променливите: функционален опфат.
Заборавете ги блоковите или било која друга техника за разрешување на опфатот која можеби ви е позната од другите програмски јазици – во JS тоа не постои.
JS ви дозволува да креирате функции како дел од други функции (т.е. да ги вгнездувате), па оттука следува дека и опфатот на функциите е исто така вгнезден. Секоја вгнездена функција може да види сè во нејзиниот родител-функција, и така натаму, нагоре по дрвото на родителски односи.
Добро, но зошто е ова важно? JavaScript јазикот има голем недостаток (или е намерно својство?) во тоа што нема никаков вид на PPP (public, private, protected) функционалност. Сè е public – јавно. Па како тогаш да се постигне барем некакво употребливо ниво на енкапсулација? Нели е тоа (енкапсулацијата) основна точка во програмерската филозофија: „отворено за проширување, затворено за модификација“?
Едно од можните решенија за овој проблем се објектно ориентираните модули.

MojObjekt = function() {

var moePrivatnoPole;

function mojPrivatenMetod(nekakvaVrednost) {
// Ova se narekuva "closure"
moePrivatnoPole = nekakvaVrednost;

// Dodeluvanje na privatna promenliva na javna promenliva
javno.moeJavnoPole = moePrivatnoPole;

return "Jas sum privaten metod";
}

/*
* Ovde se definira javniot interfejs na objektot
* so upotreba na malku JS magija: object literal
*/
var javno = {
moeJavnoPole: null,

mojJavenMetod: function() {
return "Zdravo na site!";
},

mojPrivatenMetodWrapper: function(nekakvaVrednost) {
// Povikuvanje na privaten/skrien metod
mojPrivatenMetod(nekakvaVrednost);
}
}

// Ovde ja prepokrivame povratnata vrednost na konstruktorot
// so nasiot objekt od javniot interfejs
return javno;

}

var obj = new MojObjekt(); // Vospostavuvanje na nov objekt
obj.mojPrivatenMetod(); // Ova ne raboti, bidejki e privatno/skrieno
obj.mojJavenMetod(); // Raboti!

Според Technophiliac.

5 comments:

  1. super naslov i dobar sovet za novi javascriptashi
    pozdrav

    ReplyDelete
  2. Бомбона!

    Како сум навлезен во јаваскрипт изминативе три недели, само console.log(објекти), console.info(методи) и console.error(json) гледам наоколу :)

    Туку може да се извршува на blogspot javascriptcode?

    Баш би било фино коа би го нашол obj од класата mojObjekt во конзолата на firebug и веднаш би го виделе во акција тоа што го пишуваш, кога некој ќе ја посети страницава со постов.

    За да работи и во IE console.log(obj); треба да го додадеш firebuglite 1.2.

    Ама не знам дали блогер го дозволува ова :)

    ReplyDelete
  3. http://eloquentjavascript.net/

    Ха, и ова го заборавив. Прилично забавно и интерсно, но сепак корисно онлајн книгиче за јаваскрипт од еден Холанѓанец кого лично го запознав минатата година во Пула.

    Примерите можат веднаш да се пробаат.

    ReplyDelete
  4. Фала на коментарите.
    Искрено речено, не очекував дека ќе има интерес за ова, дури и на Кајмакот дојде на листата на популарни!
    Многу сме гикови, бе мајката! :))

    Не сум сигурен дека можам да извршувам свој код на Блогеров, ама ќе ја истражам можноста.

    А успат, со последниве проекти што ги работам, скоро исклучиво JavaScript и пишувам. Како ми се зголемува комплексноста на софтверот, така морам да истражувам и нови техники во JS.
    Наскоро ќе објавам уште едно текстче - како да се изолираат повеќе JS модули на ист панел, без притоа да си ги препокриваат истоимените променливи и други објекти.

    ReplyDelete
  5. @Игор
    Фала за книгата, интересно читање.

    ReplyDelete