Објекти су камен темељац јавасцрипт-а. Многи уграђени типови података су представљени као објекти. Да бисте били успешан ЈаваСцрипт програмер, морате имати јасну идеју о томе како функционишу. Грађевни блокови објекта се називају његова поља или својства ЈаваСцрипт објекта. Користе се за описивање било ког аспекта неког објекта. Имовина може описати дужину пописа, боју неба или датум рођења особе. Креирање објеката је једноставан процес. Језик обезбеђује синтаксу познату као објектни литерали, који су означени витичастим заградама.
Језик пружа два уноса за приступ својствима. Први и најчешћи је познат као тачка нотације. У точкастој нотацији, приступ ресурсу се може добити навођењем имена хост објекта, након чега следи период и име својства. На пример, када је објецт.фоо иницијално додељена вредност једне, онда ће њена вредност постати 2 након извршења ЈаваСцрипт оператора објеката.
Алтернативна синтакса за приступ је позната као заграда. У нотацији, назив објекта прати скуп угластих заграда. У њима, име својства је наведено као стринг:
објецт ["фоо"] = објекат ["фоо"] + 1.
То је израженије од нотације тачака јер дозвољава варијабли да означи све или део имена својства. Ово је могуће зато што интерпретер ЈаваСцрипт објеката аутоматски конвертује овај израз у стринг и онда добија одговарајуће својство. Имена својстава се креирају у лету тако што се садржај варијабле ф повезује са низом "оо":
вар ф = "ф";
објекат [ф + "оо"] = "бар".
Означавање заграда дозвољава именима својстава да садрже знакове који нису дозвољени у точкастој нотацији. На пример, следећа изјава је потпуно легална у заградама. Међутим, ако корисник покуша да креира исто име својства у точкастој нотацији, он ће наићи на синтактичку грешку:
објецт ["! @ # $% & * ()."] = труе.
Приступ својствима угњежђених ЈаваСцрипт објеката може се добити повезивањем тачака и / или заграда. На пример, следећи објекат садржи уграђени објекат под именом баз који садржи други објекат под именом фоо, који има својство бар који садржи вредност пет:
вар објект = {баз: {фоо: {бар: 5}}}.
Следећи изрази приступају својству прикључене траке. Први израз користи нотацију тачака, док други израз користи квадратну нотацију. Трећи израз комбинује оба уноса да би постигао исти резултат:
Изрази као што су они приказани у претходном примеру могу довести до лоших перформанси када се неправилно користе и онемогућавају ЈаваСцрипт објекат. За процену сваке тачке или експресије заграда потребно је време. Ако се исто својство користи неколико пута, онда има смисла једном приступити својству, а затим похранити вриједност у локалну варијаблу за све будуће сврхе.
Када се функција користи као својство неког објекта, то се назива методом. Као и својства, они су специфицирани у литерарној нотацији објекта. На пример:
вар објект = {сум: функција (фоо, бар) {ретурн фоо + бар; }}.
ЈаваСцрипт објектне методе могу се позивати помоћу ознака и заграда. Следећи пример позива методу сум () из претходног примера, користећи оба уноса:
Именовање објектног литерала је корисно за креирање нових објеката, али не може додавати својства или методе постојећим. Срећом, додавање нових података је лако као креирање изјаве о задатку. Креира се празан објекат. Затим, користећи операторе доделе, додају се две особине, фоо, и бар, такође баз метода:
Основна идеја објектно-оријентисаног програмирања је да се програм подели на мање делове и да сваки од њих буде одговоран за управљање својом државом. Према томе, неко знање о томе како један део програма функционише може бити локално у том делу. Неко ко ради на остатку програма не би требало да памти или чак да зна о томе. Кад год се ови локални подаци промијене, потребно је ажурирати само код који се тренутно налази у близини.
Различити делови таквог програма међусобно комуницирају преко интерфејса, ограничених скупова функција или веза, који пружају корисну функционалност на апстрактнијем нивоу, скривајући њихову тачну имплементацију. Такви дијелови програма су моделирани помоћу објеката. Њихов интерфејс се састоји од специфичног скупа метода и својстава. Својства која су дио сучеља називају се јавна. Остатак, који не би требало да додирује спољашњи код, назива се приватним.
Многи језици пружају могућност разликовања јавних и приватних својстава и не дозвољавају вањски код за приступ приватним. ЈаваСцрипт, опет узимајући минималистички приступ, још није постигнут. Тренутно се ради на додавању овог језика. Зато ће ЈаваСцрипт програмери успешно користити ову идеју. По правилу, доступан је интерфејс описан у документацији или коментарима. Такође је уобичајено да се подвлачи (_) на почетку имена својстава да би се указало да су ова својства приватна. Одвајање интерфејса од имплементације је одлична идеја. Обично се назива енкапсулација.
Објект са заградама {...} се назива објектни литерал. Можете одмах ставити нека својства у такве заграде {...}. На пример, парови "кључ: вредност и тако даље":
лет усер = {// име објекта: "Јохн", // по кључу "наме" чува вредност "Јохн" год: 30 // по кључу "аге" чува вредност 30}.
Својство има кључ (такође познат као "име" или "идентификатор") пре двоточке ":" и вредност са десне стране. Постоје два својства у корисничком објекту. Настали ЈаваСцрипт објект са два потписана фајла са речима "наме" и "аге". Датотеке можете додавати, брисати и читати у било ком тренутку. Вредности својстава су доступне помоћу нотације тачака. Може бити било ког типа. Можете додати боолеан вриједност. Да бисте избрисали својство, користите делете у случају објекта ЈаваСцрипт ЈаваСцрипт.
Сви објекти ЈаваСцрипт грешке су потомци објекта Еррор или наслеђеног објекта:
Да бисте још дубље схватили како се апликације баве ЈаваСцрипт грешкама, боље је да се упознате са Аирбраке ЈаваСцрипт-ом - алатом за праћење бугова за упозорења у реалном времену и тренутним разумевањем шта је пошло по злу са ЈаваСцрипт кодом.
Поруке о грешкама које корисник може да прими пре уклањања ЈаваСцрипт објекта:
Можете користити квадратне заграде у објектном литералу. То се зове компјутерска својства. Пример је дат у наставку.
Вредност израчунатог својства је једноставна: [воће] значи да се име имовине мора узети из воћа. Дакле, ако посетилац уђе у "јабуку", торба ће постати {јабука: 5}. Можете користити сложеније изразе у угластим заградама:
нека воће = 'јабука';
лет баг = {
[фруит + 'Цомпутерс']: 5 // баг.апплеЦомпутерс = 5
};
Заграде су много моћније од тачкастих симбола. Они дозвољавају имена и променљиве својстава. Али они су и више компликовани за писање. Стога, већину времена када су имена својстава позната и једноставна, користи се точка. А ако вам треба нешто компликованије, онда пређите на углате заграде.
Варијабла не може имати име које је једнако једној од резервисаних речи, као што су "за", "допустити", "вратити", итд.
У принципу, свако име је дозвољено, али постоји и једно посебно: "__прото__" добија посебну жалбу због историјских разлога. На пример, не можете га поставити за вредност која није објект:
лет обј = {};
обј .__ прото__ = 5;
алерт (обј .__ прото__); // [Објецт Објецт], није функционисао како је требало
Као што се може видети из кода, додељивање примитива 5 се игнорише. Ово може бити извор грешака, па чак и рањивости, ако оператор намерава да складишти произвољне парове кључ / вредност у објекту и дозвољава посетиоцу да одреди кључеве. У том случају, посетилац може да изабере „прото“ као кључ и дода ЈаваСцрипт у објекат. Постоји начин да се објекти које обрађује __прото__ учине као регуларну особину. Постоји и друга мапа структуре података која подржава произвољне тастере.
Термин "целобројно својство" овде значи низ који се може конвертовати из целине без модификације. Тако, на пример, “49” је целокупно име својства, јер када је конвертовано у цео број и назад, оно је и даље исто. Али "+49" и "1.2" нису. С друге стране, ако кључеви нису целобројни, они су наведени у редоследу креирања. Пример испод.
Да бисте исправили проблем уз помоћ телефонских кодова, можете „варати“ тако што ћете кодове учинити не-бројевима. Додавање "+" (знак плус) прије него што је сваки код довољан. Сада ће радити као што је планирано.
Разлика између објеката и примитива је у томе што се они чувају и копирају „према референци“. Примитивне вредности се додељују и копирају "као целобројне вредности". Варијабла похрањује “адресу у меморији”, а не сам објект или “везу” с њом. Можете користити било коју варијаблу да приступите и промените њен садржај.
Горњи пример показује да постоји само један објекат и администратор који га може унети. Затим, ако се други кључ (корисник) користи касније, корисник ће открити промјене.
Оператори једнакости == и строга једнакост === раде за објекте на исти начин. Два објекта су једнака само ако су исти објект. За поређења као што су обј1> обј2 или за поређење са примитивним обј == 5, објекти се конвертују у примитиве. Искрено, таква поређења су веома ретко потребна и обично су резултат грешке кодирања.
Објекти имају приступ било којој имовини. Међутим, ако уопште не постоји, то неће бити грешка. Само приступ непостојећем својству се враћа недефинисан. Пружа веома уобичајен начин да се тестира својство и упореди га са недефинисаним. Испод је примјер.
Користите "ин" за својства која се чувају као недефинисана. Обично строга провера поређења "=== ундефинед" ради добро. Постоји посебан случај када не успе, а "ин" исправно ради. Ово је када постоји својство неког објекта, али сачува недефинисано.
У горњем коду, објекат обј.тест технички постоји. Стога, оператор ин исправно ради. Такве ситуације се дешавају веома ријетко, јер се не дефинишу обично. Углавном се користе нулл "ункновн" или "емпти" вредности. Дакле, у изјави је, у ствари, гост у коду.
Да бисте се кретали кроз све кључеве од објекта до објекта, постоји посебна форма петље: за..ин. Ово је потпуно другачија ствар од конструкције за (;;).
Испод је примјер.
Треба напоменути да сви за конструкторе дозвољавају декларисање променљивих петљи унутар петље као тастер „Лет“. Уместо тога, можете користити друго име променљиве кључа.
На примјер, за (нека проп у обј) је такођер широко кориштен.
Постоји алтернативна “квадратна заграда” која ради са било којим низом.
У овом случају, тачка захтева да кључеви ЈаваСцрипт објекта буду валидни идентификатори променљиве, то јест, да нема размака и других ограничења. Мора се водити рачуна да се стринг унутар заграда исправно наводи. Заграде такође пружају начин да се добије име својства као резултат било ког израза, за разлику од литералног низа, из променљиве:
нека кључ = "воли птице";
// исто као корисник ["ликес бирдс"] = труе;
усер [кеи] = труе.
Овде се кључна променљива може израчунати у време извршавања и зависи од корисничког уноса, а затим ће се користити за приступ својству. То даје програмерима већу флексибилност. Тачкаста нотација се не може користити на сличан начин, јер ће бити итерација ЈаваСцрипт објекта. Испод је примјер.
Декларисани цонст објект се може модификовати. Пример је дат у наставку.
Може се чинити да ће ЈаваСцрипт објект у низу (*) изазвати грешку, али није. То је зато што цонст снима вредност самог корисника. И овде корисник стално држи везу са истим објектом. Линија (*) улази у објекат, није додељена кориснику. Цонст ће дати грешку ако покушате да инсталирате корисника и нешто друго. Клонирање и спајање, Објецт.ассигн креира другу везу ка истом објекту ако га желите дуплицирати. Ово је такође изводљиво, али мало компликованије, јер ЈаваСцрипт нема уграђену методу. У ствари, ово је ријетко потребно. У већини случајева користи се копирање референцом. Али ако вам је заиста потребна, онда морате да креирате ЈаваСцрипт објекат и реплицирате структуру постојећег тако што ћете копирати његова својства на примитивном нивоу. Испод је примјер.
За то можете користити и методу Објецт.ассигн. Аргументи дест и срц1, ..., срцН су објекти. Копира својства свих срц1, ..., срцНИНТО дест. Другим речима, својства свих аргумената, почевши од другог, копирају се у први. Затим се враћа у дест. На пример, можете га користити да комбинујете неколико објеката у један.
Такође можете користити Објецт.ассигн да замените једноставну клонску петљу. Копира сва корисничка својства на празан објекат и враћа је, баш као и петља, али укратко. До сада се претпостављало да су сва корисничка својства примитивна. Али својства могу бити референце на друге објекте.
Да бисте то исправили, морате да користите клонски циклус, који проверава сваку вредност корисника [кеи] и, ако је објекат, реплицира његову структуру. Ово се зове "дубоко клонирање".
Постоји стандардни алгоритам дубоког клонирања који се бави горе наведеним случајем и сложенијим случајевима, који се називају алгоритам структурираног клонирања. Да не би поново измислили точак, можете користити радну имплементацију из лодасх ЈаваСцрипт библиотеке, метода која се зове _.цлонеДееп (обј).
Ако програмер прелази преко објекта и настоји да добије сва својства у истом редослиједу у којем су додани, он се може ослонити на “наручивање на посебан начин” када се сортирају цјелобројна својства, а други се формирају редослиједом креирања ЈаваСцрипт објекта.
Напредне методе објекта баве се концептима који се ретко користе у ЈаваСцриптингу. То је због чињенице да у нормалним сценаријима ове моћне функције нису потребне. Неки од ових метода можда неће радити у старијим прегледачима, као што су ранијих издања Нетсцапе 4.
Кориштење прототипа може се примијенити за креирање ЈаваСцрипт објеката и свих мицирцле метода, а не само нових. Ово даје мешано оптерећење перформанси. Они не морају да чувају засебне копије метода за сваку инстанцу објекта, тако да може да заузме мање меморије за рад, али претраживач мора да тражи тренутне и надређене области да их пронађе. Ово може узроковати максимално кашњење. Типично, корисник треба да користи оно што је прикладно за код, и да не заснива ову одлуку на перформансама, осим ако се бави врло специфичним контролисаним окружењем.
У неким случајевима може бити неопходно да својство објекта буде везано за сам предмет или негде у ланцу прототипа. У ЈаваСцрипт-у, сви објекти користе метод хасОвнПроперти, који враћа труе ако је ово својство везано за појединачну инстанцу објекта. У овом случају, могуће је проверити да ли конструктор објекта има исту особину са истом вредношћу као и сама инстанца објекта. Ово може дати погрешан резултат ако постоје засебна својства ЈаваСцрипт објекта с истом вриједношћу и за објектну инстанцу и за ланац прототипа. Метода хасОвнПроперти узима један параметар - име својства као стринг.
Слично томе, можете креирати приватне методе. То је једноставно функција која се креира унутар конструкторске функције. Некима то може изгледати збуњујуће, али тако функционира. Приватну функцију може позвати само конструктор или методе које су дефинисане у низу. Могу се користити као јавне методе ако су додељене јавном конструктору и доступне су помоћу јавних метода Јавасцрипт објеката.
функција миоб () {фунцтион цантБеСеен () {алерт (сецретВалуе);
} вар сецретВалуе = '';
тхис.метход1 = фунцтион () {сецретВалуе = 'нема изненађења';
цантБеСеен ();
};
тхис.метход2 = цантБеСеен;
} вар онеОб = нев миоб ();
онеОб.метход1 ();
// упозорава 'без изненађења' онеОб.метход2 ();
// упозорава 'без изненађења'.
Објекти команди дозвољавају лабаво повезане системе раздвајањем оних који праве захтјеве од објеката и, у ствари, обраде захтјева. Ови захтеви се називају догађаји, а код који рукује захтевима назива се догађајима.
Претпоставимо да су апликације креиране које подржавају акцију у међуспремнику Изрежи, Копирај и Залијепи. Ове акције се могу покренути на различите начине у целој апликацији: систем менија, контекстни мени, на пример, десним кликом на текстуално поље или помоћу пречице. Објекти наредби вам омогућују да централизирате процесирање тих акција, по један за сваку операцију када вам је потребна само једна наредба за обраду свих захтјева за резањем, један за све захтјеве за копирање и један за све захтјеве за лијепљење.
Пошто команде централизују сву обраду, оне такође често учествују у обради функција поништавања за целу апликацију. Значајна побољшања могу се постићи употребом модерних ЈаваСцрипт метода, што доводи до стварања ефикаснијих, поузданијих и подржаних апликација.
Да бисте сазнали како то урадити, можете користити ЈаваСцрипт + јКуери предлошке. Овај јединствени пакет укључује оптимизирани ЈаваСцрипт за све ГоФ предлошке који користе напредније функције као што су простори имена, прототипови, модули, функционални објекти, затварања, анонимне функције и још много тога. Ако корисници требају најновије алате и методе за ЈаваСцрипт предлошке, јКуери предлошке и архитектуре предложака, онда је ово најбољи начин употребе. Овај пакет садржи корисне, ажурне информације за ЈаваСцрипт програмере. Ево шта је укључено:
Предложене синтаксне основе ЈаваСцрипт објеката су веома важне за почетнике програмера. Прво морате разумети објекте, онда ће постојати знање о објектно оријентисаном програмирању. Изузетно је важно имати дубоко разумијевање овог материјала, јер то служи као основа за остатак ЈаваСцрипт језика.