Заголовок документа


Тұйықталу көмегімен жекеше әдістерінің эмуляциясы



бет19/26
Дата15.03.2024
өлшемі465.78 Kb.
#495676
1   ...   15   16   17   18   19   20   21   22   ...   26
JAVA SCRIPT-ОБЪЕКТІГЕ БАҒЫТТАЛҒАН СКРИПТІК БАҒДАРЛАМАЛАУ ТІЛІ-оқулық

Тұйықталу көмегімен жекеше әдістерінің эмуляциясы


Java сияқты тілдері жекеше әдістерін жариялауға мүмкіндік береді. Бұл кезде тек сол класстағы басқа әдістер оларды тудыруы мүмкін, ал олар сыртында қол жетімді емес.
JavaScript мұндай тікелей жасау мүмкін болмайды, бірақ мұндай сипаттауды тұйықталу арқылы эмулирлеуге болады. Кодқа қол жеткізуді шектеу үшін, кейбір әдістердің жекешелеу мағынасын жасау керек емес. Бұл өзінің дербес жаһандық атаулар кеңістігінің жалпы кеңістіктігін бітемеу үшін құрылатын жақсы амал, яғни жалпы кеңістікте жекешелеу мүлдем қажет емес.
Міне, жекешеленетін әдістерге және айнымалыларға қол жеткізетін, тұйықталу көмегімен бірнеше көпшілік жария әдістерін сипаттау. Мұндай бағдарламалау мәнері module pattern деп аталады. "Модуль", "шаблон" және "Javacript"деген іздеу сөздерін пайдалануға болады:
var Counter = (function() { var privateCounter = 0; function changeBy(val) { privateCounter += val;
}
return {
increment: function() { changeBy(1);
},
decrement: function() { changeBy(-1);
},
value: function() { return privateCounter;
}
};
})();
alert(Counter.value()); /* Alerts 0 */ Counter.increment();
Counter.increment(); alert(Counter.value()); /* Alerts 2 */ Counter.decrement(); alert(Counter.value()); /* Alerts 1 */
Мұнда көп нәрсе өзгерді. Алдыңғы мысалда әрбір тұйықталуда орындаудың (ортасы алған болса) өз контексті болды. Мұнда үш функция үшін біртұтас ортасын құрамыз: Counter.increment, Counter.decrement және Counter.value.
Жасырын функциялар құрамында бірыңғай орта құрылады, ол сипаттау сәтті орындалады. Бұл орта құрамында екі жекешелену элементі болады: privateCounter айнымалысы және changeBy фукциясы. Бірде-бір осы элементтердің бірі қол жетімді емес, тікелей ең анонимді функциялардан тыс болады. Оның орнына олар қолжетімді және үш жария функциялары пайдаланылуы тиіс, олар сол анонимді функцияларда орындалады, анонимді блок кодын қайтарады (anonymous wrapper).
Бұл жалпы контекстті орындауда (ортасы) пайдаланылатын,үш жария функциялары тұйықталу болып табылады. lexical scoping Javascript механизімі көмегімен, олар privateCounter айнымалысы мен changeBy функцияларына қол жеткізеді. Назар аударыңыз, есептегіш жасайтын анонимді фунцияны суреттейміз, және Counter айнымалының орындау нәтижесін тағайындап,оны бірден іске қосамыз. Бірақ бұл функцияны бірден іске қоспауымызға болады, оны жеке айнымалыны пайдалану үшін сақтап, одан әрі осылай бірнеше есептегіштерді құра аламыз:
var makeCounter = function() { var privateCounter = 0; function changeBy(val) { privateCounter += val;
}
return {
increment: function() { changeBy(1);
},
decrement: function() { changeBy(-1);
},
value: function() { return privateCounter;
}
}
};
var Counter1 = makeCounter(); var Counter2 = makeCounter();
alert(Counter1.value()); /* Alerts 0 */
Counter1.increment(); Counter1.increment(); alert(Counter1.value()); /* Alerts 2 */ Counter1.decrement(); alert(Counter1.value()); /* Alerts 1 */ alert(Counter2.value()); /* Alerts 0 */
Назар аударыңыз, бұл есептегіштер бір бірінен тәуелсіз жұмыс істейді. Мұның себебі, makeCounter() функциясымен олардың әрқайсысын құру кезінде, өзінің жеке контекстін орындау (ортасы) құрылған. Бұл шын мәнінде жеке өзіндік айнымалы,яғни әрбір есептегіштердің жекеше privateCounter айнымалысы.
Тұйықталуды осылайша пайдаланып, әдетте объектілі-бағытталған бағдарламалаумен байланысты оқшаулау және инкапсуляция сияқты, сіз бірнеше артықшылықтарды аласыз.
Тұйықталуды құру циклі: Өте жиі кездесетін қате.
ECMAScript 6 нұсқасы let кілт сөзін енгізді. Келесі мысалды қарастырайық:

id="help">Helpful notes will appear here


E-mail:
type="text" id="email" name="email">


Name:
type="text" id="name" name="name">


Age:
type="text" id="age" name="age">
function showHelp(help) { document.getElementById('help').innerHTML = help;
}
function setupHelp() { var helpText = [
{'id': 'email', 'help': 'Ваш адрес e-mail'},
{'id': 'name', 'help': 'Ваше полное имя'},
{'id': 'age', 'help': 'Ваш возраст (Вам должно быть больше 16)'}
];
for (var i = 0; i < helpText.length; i++) { var item = helpText[i];
document.getElementById(item.id).onfocus = function() { showHelp(item.help);
}
}
}
setupHelp();
Массив helpText үш кеңес үшін үш алаңды енгізуді сипаттайды. Цикл-бұл сипаттаулар кезек бойынша жүріп өтеді және әрбір енгізу өрісін анықтайды, бұл кезде onfocus оқиғалары үшін, бұл элементке керек функция туындайды, көрсететін тиісті ақпарат жазылып тұрады.
Егер сіз бұл кодты іске қоссаңыз, онда оның біз қалағандай жұмыс істемейтінін көруге болады. Сіз қандайда өрісті таңдасаңызда, кеңестер ретінде әрқашан құқы туралы хабарлама көрсетіледі.
Функциялар onfocus оқиғаларды өңдеуіштер ретінде берілген тұйықталу болып табылады. Олар setupHelp функциясынан мұраға қалдырылған функцияларды сипаттаудан және орындау (ортасынан) контексттен тұрады,.Үш тұйықталу құрылды, бірақ олардың барлығы бір контекстті орындаудан (ортада) құрылған. onfocus оқиғалар сәтінде туындаған цикл бұрыннан жұмыс істеді, ал item (үш тұйықталу) айнымалы массивтің соңғы элементін көрсетеді, ол өріске байланысты.
Бұл жағдайда шешім ретінде функцияларды, фабрикалық функцияларды (function factory), жоғарыда мысалда сипатталып айтылған пайдалануды ұсынуға болады:
function showHelp(help) { document.getElementById('help').innerHTML = help;
}
function makeHelpCallback(help) { return function() { showHelp(help);
};
}
function setupHelp() { var helpText = [
{'id': 'email', 'help': 'Ваш адрес e-mail'},
{'id': 'name', 'help': 'Ваше полное имя'},
{'id': 'age', 'help': 'Ваш возраст (Вам должно быть больше 16)'}
];
for (var i = 0; i < helpText.length; i++) { var item = helpText[i];
document.getElementById(item.id).onfocus = makeHelpCallback(item.help);
}
}
setupHelp();
Міне, бұл жөнді жұмыс істейді. Барлығына бір ортадан бөлудің орнына makeHelpCallback функциясы әрбір тұйықталуға өзінің жекелігін жасайды, онда item айнымалы helpText массивтің дұрыс элементін көрсетеді.


Достарыңызбен бөлісу:
1   ...   15   16   17   18   19   20   21   22   ...   26




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет