>> Så, når det er sagt,
bare liksom en enkel introduksjon til prototyper
og Javaobjektmodellen.
Vi kommer ikke til å skifte gears litt å snakke
om mer Java på server og bokhyllen Library
og tilkoblingen Knex Biblioteket.
Så, kan du faktisk bare -
hvis du søker etter Bookshelf.js det burde være ganske enkelt
å finne, bør være første resultat, og bokhylle
som David nevnt bare gir en masse med struktur
rundt Javascript objekter og jobbe med dem relasjonelt
i relasjonsdatabaser.
Så mange lignende funksjoner hvem er faktisk tungt inspirert
av Laravel sin ORM som vel som Backbone.js,
som er en front end MVC bibliotek som lar deg
å strukturere koden din, ligner på det jeg viste
med eksempler på prototyper hvor du kan -
i stedet for bare vilkårlig kaste klasser
på dine synspunkter her og der.
Det gir deg modeller og samlinger av disse modellene
som er ment å fungere som liksom en single point of sannhet
om dataene for søknaden din.
Og så du lytter til, som de modeller endringer, sier du, OK,
re-gjengi denne malen her og dette over her
og ikke bare legge klasse her, legge klasse der og liksom plukke
på velgere og gjøre spindelvev av jQuery kode.
Det gir fortrinnsvis av klassen basert struktur til enkelte brikker,
men en viktig komponent at biblioteket er modellene
som har en lignende struktur til hva bokhylle modellene gjør.
Så, hvis du er kjent med Bokhylle du er pen også
ganske kjent med Backbone.js modeller,
og jeg vil anbefale ta en titt på denne.
Så, noen av de viktigste funksjonene
at det gir deg er akkurat den Muligheten til å lagre data på et objekt
å ringe hente, som returnerer en individuell rekord
fra databasen, oppretter relasjoner som ligner
til hva du utdelt innenfor i Laravel
der du kan si en Pasienten satt en rekord metode
og si dette har vunnet posten
der posten objektet er Tabellnavn pasientjournaler.
La oss se.
Har mange - den tilhører -
bare ting som du er ganske lik -
ganske kjent med allerede, men i Javascript.
Og under panseret, for bokhylle,
den bruker en spørring byggmester kalt Knex.js.
Så, det er Knex, knexjs.org.
Det er en referanse til leketøy hvis noen noensinne har spilt med dette.
Men det kan du - i en lignende måte, til jQuery,
du bare liksom lage en kjede av forskjellige fremgangsmåter
at du ringer på database rad, slik at du kan -
du startet med å si Knex og tabellnavnet.
Så, for eksempel, knex brukere, velge hvilke kolonner du ønsker,
der, og har forskjellig hvor conditionals og du kan ha
OG der, eller der, der mellom, hvor ikke,
du nå, ned linjen.
Du kan angi ulike sammenføyninger mellom databasetabellene
som bokhylle bruker internt å sette opp slags magi
rundt hasOne, hasMany, belongsTo, belongsToMany.
Og så kombinasjonen
av de to la deg gjøre ganske mye hva du ville bli brukt
til i rammeverket som Laravel i form
av funksjonalitet jobbe med databaser.
Så, la oss gå videre og ta en titt på et enkelt eksempel
for en Express app som gjør bruk av disse modellene
og samlinger av Bokhylle jazz [fonetisk].
Så har jeg satt opp bare en enkelt program her.
Jeg strippet ut noen av tingene som ble initialisering express
og flytte det inn i en init katalogen som jeg har laget.
En av de fine ting om arbeider med Express som skulle
til Laravel er at det er egentlig ikke mye håndheves
på deg conventionalized.
Så du kan opprette kataloger -
det gjør egentlig ikke gi deg en hel masse å jobbe ut av.
Du har bare liksom litt grunnleggende innstillinger og deretter -
men det bryr seg ikke hvor du plasserer dem.
Du trenger ikke å ha kontrollerens katalog.
Du trenger ikke å ha noen modeller katalog, en config katalogen.
Du kan liksom lage de som prosjektet ditt behov
og sette ting opp veien som gir mening mest for deg.
Så i stedet for å ha alle dette uttrykkelig boilerplate
i hoved app.js jeg nettopp sa app likemenn krever init / hurtigbåt.
Og så i init,
den initialisering mappen Jeg har nettopp Express her,
og dette krever Express, samtaler oppsettfunksjonen, kaller -
setter opp visningen motor, JSON-parser, alt det der.
Så nå, la oss fortsette ned.
Så jeg krever kursinstruktør møte
og krav modeller.
Så disse er i en mappe som Jeg bare bestemte meg for å navngi modeller.
Det trenger ikke å være at måte, men det er fornuftig,
men modellene er like pen vanlig så jeg vil anbefale det.
Men - Så la oss gå for kurset.
Jeg tror jeg bruker - Ja, og eksemplene
her nede er alle basert rundt kursmodell.
Så la oss bare ta en se på det.
Så, nå, bare av første linje i denne modellen
Jeg er allerede krever noe annet.
Så hvis du vil legge merke til i node du bør kreve
eller du kommer til å ende opp krever en hel haug
forskjellige filer som er plassert
på forskjellige steder i din søknad.
Og den relative stier til uansett hvor du er
i din nåværende program,
med mindre det er en topp nivå allerede definert som i du installere den
med MPM som bokhylle eller Knex eller Express eller noe,
de er ikke relativ.
Ja? Zoome inn mer?
OK. OK. Så, du kommer til å ende opp som krever en hel haug
av bare forskjellige filer i din kode, noe som er bra og dårlig.
På en god måte du vet hvor ting er og det er ikke sort
av magi som til hva som er skjer under panseret,
som virkelig kan være forvirrende
når du har en veldig tung Java -
eller svært tung rammeverk som Laravel, som liksom sier,
vi kommer til å ta vare av dette slik at du ikke trenger
å kreve alt men du må
å vite hvordan alt arbeider for å kunne bruke den.
Der som i dette tilfellet, er det veldig grei som til
hvor alt er, de er bare endene
opp med å bli litt mer å skrive.
Akkurat som i den siden jeg liker å bruke, det er en plugin
hvis du bruker en blind tekst
hvor du kan installere den noden moduler hjelper og du kan starte
å skrive ut som instruktør og det skaper den relative banen
til hvor du er til at kode-fil, slags nyttig.
Så, kursmodellen er krever base her
og deretter basen lærling krever init / bokhylle
og deretter bokhyllen, det krever det øverste nivået bokhylle
og deretter starter den med den initialisert Knex eksempel,
som setter kunden navnet
og forbindelsen innstillingene for databasen.
Så jeg bare bruker en enkel forekomst av Sequel Pro som -
av MySQL, jeg tilgang til det med Sequel Pro, og den har bare en slags
av en tilsvarende database oppsett som vi hadde
i det første prøvepåføring med kurskatalogen.
Så setter jeg min forbindelse innstillinger her,
og disse er alle dokumentert på Knex.js prosjektsiden
om hvordan man skal sette opp disse tilkoblingene.
Så, jeg har nå mitt basismodellen.
Og som jeg nevnte med prototypen endring,
slik som faktisk kan være slags mye til -
legger mye av standard til koden din slik konvensjonen
som har blitt tilpasset av Backbone.js
og nå Bookshelf.js er å legge dette utvide metoden
som en statisk egenskap på Javascript-objekter,
som gir den en slags nesten klassebasert arv natur
der hvis du ringer utvide du kan sette opp noen
av prototypen metoder som du ønsker her
og så du kan - noe ekstra statiske metoder
som du kanskje ønsker, du kan bare sette dem selv
her ute så jeg kan utvide det med - så hvis for eksempel
flere modeller som trengs vise navnet og denne får navn.
Så, her, jeg sier det visningsnavn for modell
som standard er uansett navn Eiendommen er ellers retur
ikke noe navn.
Og nå på hver modell som er et -
som utvider denne basismodellen, jeg nå har et visningsnavn metode
på prototype kjeden et sted.
Og hvis jeg ønsker å overskrive den Jeg kan bare sette den - sett hva -
getName ville være her.
Og det tillater deg å etterligne klassisk arv
i Javascript, kan som være fint særlig for ting
som egner seg å være klassebaserte som objektmodeller.
Så la oss hoppe tilbake i applikasjonskoden.
Så jeg har fått en rute for bare slash, bare for indeksen min
og deretter kutte kurs.
Og begge disse ringer den renderCourses metoden.
Så igjen, funksjoner er første klasse og kan sendes
som argumenter til metoder.
Så, i denne app.get, Jeg ringer -
Jeg passerer renderCourses som argument.
Og gjengi - eller funksjoner kan settes opp som Var -
som jeg gjorde tidligere Div. renderCourses lik funksjon
eller de kan være bare funksjons renderCourses.
Det gjør ikke så mye av en forskjell.
Du kan faktisk ha det kalles navn funksjon
uttrykk, som er Var renderCourses likemenn
funksjons renderCourses.
Og grunnen til å ønske å ha navngi funksjoner spesielt
i node er at det gir deg en renere -
mer lesbar stabel spor.
Så hvis du har en hel haug
anonyme funksjoner det vil si -
når du har en feil i koden you'll -
du vil ikke vite hvilken funksjon det ringer du måtte se
ved kodenummeret og linjenummeret
og det er noen ganger lettere bare for å visuelt analysere
når du faktisk har navn
for funksjonene seg på serversiden.
Så dette renderCourses, la oss kalle node apps -
så jeg hører på Kjerne 3000 [fonetisk].
Og så alt dette gjør rett her er bare å få all den
kurs fra databasen.
Jeg er ikke engang å begrense det så det gjør et stort nummer
rader den returnerer.
Og for å gjøre dette,
på kursmodell der er en statisk eiendom
kalt samlingen.
Og så jeg bare kalle det - jeg sa opprette en ny samling
for dette kurset, og deretter hente den,
og deretter returnere kursene samling her i løftet.
Så internt, David i - siste halvdel lært litt
om løfter og løfter er brukes svært tungt i både Knex
og bokhylle fordi det gir den -
det gir deg Evnen til å ha en haug
forskjellige asynkrone samtaler og liksom bli deretter sammen
eller hente noe, og deretter
med at samtalen en annen asynkron database samtale
og returnerer denne verdien og deretter hoppe til neste og deretter
og neste deretter, og deretter ha en fange helt på slutten for å sortere
av mimikken asynkron try catch adferd med asynkron kode,
fordi du ser det nå
men det er enda vanskeligere når du begynner å takle det.
Asynkron kode er bare overalt
i server side Javascript og virkelig i mye større grad
enn du er vant til hvis du har gjort Java
på klientsiden.
Så det virkelig, virkelig hjulpet deg der ute.
Men bare for å vise deg debugger uttalelse
at jeg snakket om i node inspektør verktøy,
Jeg kommer til å gå videre og kaste en debugger linje her
i renderCourses funksjon og se hvor det fører meg
når jeg - så node inspektør kan installeres
ved å gjøre NPM Installer med en G flagg,
som betyr Globalt Node Inspector.
Og det vil hente det for NMP og installere den globalt
for dine applikasjoner så du kan bare kalle det
fra kommandolinjen.
Jeg har allerede installert det så jeg skal gå videre og -
faktisk kan det ha å vente det vil bare ta,
ta to sekunder.
Og hva node inspektør igjen gjør at du
å gjøre er å ha denne hodeløse versjon av debugger konsoll
at du er vant til når du arbeider på klientsiden og være i stand
å stoppe, bare legge spesifisert peker i koden din.
Stoppe kjøringen og ta en se på hva som skjer,
som ville ha virkelig komme godt med dersom funksjonen
sånn var tilgjengelig
når debugging din PHP-koden er jeg sikker på.
Så la oss bare ta en se på det.
Så jeg kan bare ringe node inspektør
og det vil si å besøke denne nettadressen port 5858 for å starte feilsøking,
det er bare standard for hvordan den starter opp.
Så, jeg har nå fått - det er ingenting skjer her
fordi jeg trenger for å starte.
Så node uføret [fonetisk] den debug flagg og deretter app.js.
Så det sier debugger lytter på port 5858,
Express server lytting på 3000.
Så vi er godt å gå.
La meg bare oppdatere dette.
Og nå kan jeg se app.js kode som jeg bare ser på
men her i konsollen.
Så nå, hvis jeg prøver å kjøre dette, du kan se det, stopper det.
Det er bare å vente fordi dens Hele kode er nå
stoppet på denne debugger linje som jeg har satt inn der.
Og jeg kan nå server -
[Hørbar Remark]
Å, ja. Hva er nøkkelordet snarvei for å zoome skjermen?
Oh det er.
Fikk det. OK.
[Pause]
Åh, det er ikke på jakt [Fonetisk] det.
Så, er virkelig stort kurs
fordi jeg ikke gjør en begrense klausul eller noe,
det er bare å hente den hele databasen av kurs
som er mange av dem.
Og så - som er gjenstand
som faktisk kan krasje notatet inspektør eksempel.
It '- OK.
La meg gjøre en grense og så kan vi ta en titt
når det ikke er henting hundrevis av kurs.
Så, drepe serveren og inspektør
og jeg skal gjøre kurset samling spørgrensen 20.
Så, i bokhylle, i motsetning til i Laravel
hvor du kan bare ringe begrense direkte eller ringe noen
av disse SQL metoder at du bruker
til direkte på ORM eksempel.
Når som helst at du bruker bare SQL-metode som er gitt
i Knex, må du kaller spørringen til å sortere
av tappe inn i søket kjeden.
Og dette kan påberopes med enten en funksjon
så du kan si, funksjon denne grensen 10 eller du kaller det
ved å angi hvilke metode du ønsker å ringe
på Knex eksempel og deretter hvilken verdi.
Så vi kommer til å gjøre begrense 20 og deretter satt.
Vi har faktisk ikke trenger debugger her
fordi vi kan bare angi stoppunkt
og som gjør det enklere.
OK.
Så, la oss sette en stoppunkt akkurat her og prøver å laste den.
Feil linje.
Akkurat her.
[Pause]
OK. Så det stoppet igjen.
Så nå, er kurs en objekt med lengde 20
og vi kan se alle de forskjellige modeller som det er hentet
fra databasen her så jeg har fått en modell objekt
som har, inne attributter eiendom
på objektet er alle de tingene at det er funnet i databasen.
Eventuelle hendelser som har blitt registrert
slik at du kan registrere ulike hendelser,
for eksempel når Modellen blir slettet
eller når det er å være hentet,
du kan angi forskjellige egenskaper eller endre ting.
Det er mange forskjellige kroker og disse er alle dokumentert
i Bookshelf.js dokumentasjonen som lar deg
å gjøre liksom noe at du virkelig ønsker å gjøre
med modeller og samlinger.
Du kan - de er ment å være virkelig passelig
og veldig lett for du å tilpasse dem
til behovene til din søknad.
Men bare se gjennom her,
Jeg kan se hva de forskjellige kurs er tilgjengelig.
Og i dette tilfellet, I faktisk ikke hente
med andre enn andre data bare kursene selv.
Men på lignende måte til den veltalende ORM du kan stille
opp forbindelser, så emnet tilhører mange instruktør.
Så, hvis jeg går videre og stoppe programmet,
hoppe til dette hente samtalen, du kan angi forskjellige alternativer
at du ønsker å sende videre til den.
Og en av dem er muligheten til å laste relatert kode
ved å spesifisere withRelated instruktører deretter kurs.
Så la oss gå tilbake og frisk dette her og stoppe igjen.
Så nå, kursene objekt, samme antall modeller
men nå hver modell har relasjoner hash
som har instruktører at det er relatert til.
Så dette kurset for eksempel
som er selvfølgelig 082 har to relaterte instruktør modeller.
Og du kan allerede se hvordan mye lettere dette er å sortere
av visuelt arbeide med enn når du arbeider med ting
at du liksom endre koden og deretter prøve det igjen i PHP.
Det faktum at du kan bare stoppe kjøringen helt
og vurdere hva som er her og den - i konsollen, -
zoome ut, er kurs, du vet,
hva at den lokale omfang variabler er tilgjengelig
og dette er i dag den globale objektet, fordi som du så det,
med mindre du ringer med en spesifikk kontekst, er det ikke kommer
å ha noe relevant her.
Og så, den - la meg vise noen flere eksempler
gjennomføre løftene.
Så i stedet for å gjøre dette withRelated instruktører her jeg
kommer til å gå videre og flytte denne å hente og deretter kursene,
Jeg kommer til å returnere courses.load instruktører.
Og så - så du ringe da.
[Pause]
Så deretter ved dette punktet, Kursene skal være lastet
med instruktører, som er asynkron handling.
Men fordi vi er tilbake det fra et løfte, neste verdi
for da er det dette asynkrone kallet returnerer
som i dette tilfelle belastningen er en metode i bokhyllen
som faktisk returnerer samlingen i seg selv.
Så det er lasting av instruktører på det
og deretter kan du spesifisere - hvis det er bare én eiendom,
du kan angi dette som streng, ellers,
du kan gjøre instruktører og krav
som metode - beklager, som en matrise.
Og så hvis du ønsker å få virkelig fancy og begrense eventuelle
av disse gitt hentingene, du kan angi det som en hash
med instruktører og deretter hva du liker å begrense søket på.
Så, jeg ønsker å laste alle instruktører på kurs der -
så QB for spørreverktøyet der status er aktiv.
Og du kan få virkelig fancy med noen
av de relaterte søk du ønsker å bygge.
Men, bare for nå, skal vi å holde seg til bare instruktører
og vi er tilbake som verdi
så da neste så bør har alle kurs lastet
opp ordentlig.
Og hvis det var en feil på alle trinn i denne kjeden,
det ville hoppe ned til fangst.
Så la oss gå videre og kjøre det.
Så hver gang - i motsetning til i PHP, er en ulemper
"Fordi node" er en lang løpe prosessen, du faktisk trenger
å stoppe node prosessen som du oppdatere koden,
fordi den versjonen som det er kjører i kjøretid er,
den versjonen av kode som var lastet
da startet ikke hva har du liksom
av oppdaterte koden din med siden da.
OK. Vi vil sette en stoppunkt her, her og refresh.
[Pause]
Åh, jeg gjorde faktisk ikke oppdatere denne siden enten
så det var på den gamle prosessen.
Så du oppdatere både denne og node inspektør.
Så nå ser vi kurs.
Hvis vi bare ta prøven av et av disse modellene
Vi kan se at relasjonene objektet er tom, men nå -
og grunnen til at du trenger å sette svake punktene er, vel,
Jeg nevnte at du kan hoppe inn i bunken spor
og ser du vet, hvor det kommer i app.
Så nå kan jeg se hva som er skjer i lastemetode
som jeg har definert på samlingene.
Det liksom "Eager laster relasjoner på en allerede ".
Og du kan gå gjennom og se linje for linje
hvor slike ting er kommer noe som er flott.
Hvis du har noe som er brutt i koden,
det er å kaste noen feil og du er som jeg virkelig ønsker
å se hvor dette går.
Men så snart du kjører inn noe asynkron, det -
det går til neste huke av hendelsen sløyfe
og du vil miste - du miste plassen
i node inspektør.
Så du trenger å si, "OK, når jeg mister dette,
det er behov for å stoppe nå på denne linjen igjen. "
For hvis jeg holdt trykket ned, ned bunken,
det ville ha slutt bare gått bort hadde jeg ikke satt dette
linje 22 blå break linje.
Så nå, hvis jeg ser på kurs her,
den skal på forhold instruktører
og deretter har instruktører feste dem.
Så kan du se at jeg kom tilbake et løfte fra den første løftet
og da kan du kontinuerlig gjøre det nedover linjen.
Så forskjellig løftet, lover bibliotekene,
Jeg brukte en som heter Bluebird noe som er veldig nyttig.
Det gir mye fint av dette for å endre asynkron -
skiftende ringe tilbake basen koden på ting
som fungerer godt med løftene.
Men - sorry [uhørbart] hva Jeg skulle til å si det der.
La oss ta en titt men på den -
så la oss si at det var en problem ved henting av noe.
Så jeg har denne andre ruten å finne kalt kurset ID.
Så la oss gjøre kurset to.
Kan jeg få - JSON kurset.
Og dette gjør [uhørbart].
[Pause]
Jeg lukter noe galt her.
Ikke på 3000, jeg var på Chrome inspektør kategorien.
OK. Så la oss gå til selvfølgelig - JSON selvfølgelig en.
Og dette returnerer bare i JSON format, kurset lastet
opp med noen instruktører.
Men eksempelet jeg ønsket slik at her er det,
Jeg gjør JSON selvfølgelig ID.
Og i de hente parametre, Jeg spesifiserer krever sant,
som er et alternativ som er dokumentert i bokhyllen
hvor det er å si at "hvis, Jeg prøver og finne dette kurset
og det er ikke det, deretter kaste en feil. "
Og det skal bli fanget av fangsten blokkere ned her.
Så la oss gå videre og hoppe tilbake inn i node inspektør og prøve
og bryte denne og se hva vi fikk.
Så la oss sette en pause her på JSON kurset.
OK.
Jeg skal gå til JSON kurs og Jeg ville bare legge på noen -
[Pause]
Det kan være litt vanskelig noen ganger når du prøver
å styre hvilken som har blitt oppdatert
og som ikke har - la oss se.
Så det er det som ringer feil tomme respons.
[Pause]
La oss kaste en debugger i her.
På grunn av hvordan node faktisk optimaliserer
for Java runtime å være så rask på serveren,
noen ganger noden debugger har noen feil når du prøver
og sette stoppunkter dynamisk og du faktisk trenger
å bruke en debugger og ikke på linje-for-linje.
Så la oss se om dette får oss hva vi ønsker.
Så satt jeg, app.get JSON selvfølgelig id,
og jeg har satt min debugger det
i fangsten uttalelse på bunnen.
Fetch krever sant, det skal - all right, der vi går, brøt.
Så, nå kan jeg se at det stoppet
på dette siste catch-blokk fordi withRelated -
eller fordi den krever sant angitt, og det er ikke selvsagt
med ID av denne store nummer gjennom et unntak
som nå er Emessage.
Og hver feil i Javascript har en stabel eiendom
som kommer sammen med det.
Så det er ofte nyttig For å f.eks
trøste logge ut e.stack.
Og jeg kan faktisk se når jeg treffer en feil.
Så jeg får feil tom respons, er at meldingen
som ble sendt via bokhylle.
Men nå kan jeg ta en titt på, i samtale stack og se
at i bokhyllen dialekter SQL modell 83,
dette tomme svar Feilen ble kastet.
Og det er her jeg nevnt, er det dot anonym
fordi det er en anonym funksjon.
Hvis det var et navn funksjon du ville ha bedre ideer
som fungerer faktisk gjennom uten å måtte gå
inn i model.js koden.
Selv om det er ment å være ganske, ganske lesbar,
slik at jeg kan se at online.
Hva sa de meg var linjen 83.
Så, hvis options.require og responsen ikke eksisterte,
det nå kaster en ny tom respons feil.
Så du kan se ganske grei hvordan det fungerer.
Og internt i bokhyllen,
det er bare en hel haug med bruk av løfter.
Så du kan spesifisere Promise.method
med Bluebird bibliotek som holder den riktige sammenheng
av dette mens retur et løfte.
Og så har jeg - jeg er bindende verdien av dette likt
til hva jeg hadde nevnt tidligere, men ved hjelp av løfter
og så kan jeg - er ny.
Det kan være asynkron eller ikke hvis jeg vil.
Og så gjør jeg noen andre ting som kan
eller ikke kan være asynkron og deretter slags hopp ned dette.
Så Promise.all er en hjelper som en rekke populære bibliotek har
hvor du kan ha en rekke potensielt kan
eller kanskje ikke løfter.
Og når alle disse er ferdig, kommer du tilbake som
og så den hopper til neste linje
og du kan se hvordan det egentlig flater ut pyramiden
at du kommer, jo tilbakeringing helvete som kjent
hvis du gjør alt med tilbakeanrop linje for linje.
Det finnes måter å komme rundt det, men løftene er en
av de beste måter i min mening
å virkelig holde koden ren og lett å lese.
Så det er bare en kort innføring i Javascript
og til bokhyllen og Knex generelt.
Og, hvis det er noen spørsmål, Jeg vet at det er massevis av materiale
å liksom prøve og dekke spesielt siden de språkene,
i motsetning til de fleste som du er kjent med, så jeg ville bare
å gjøre det slik at minst hvis du har problemer
med koden din, du kan liksom hoppe i -
det er det jeg liker å gjøre, er liksom hoppe inn i bibliotekene
som jeg bruker og se hvordan ting er strukturert.
Det er en som jeg hadde nevnt tidligere kalt Backbone.js
og faktisk er det [Uhørbart] på klientsiden
å bidra til å gi modellen visning kontrolleren struktur
til koden din.
Men det har faktisk annotert kildedokumentasjon
som gjør at du kan liksom se.
Det er veldig bra dokumentert, er hva som skjer,
hvordan det er å forsterke Ajax-funksjonalitet
eller hendelsen funksjonalitet eller modellene og samlinger sorter
å forklare hva som er skjer i prosessen.
Og hvis du forstår det grunnleggende av Java
som prototypal arv og akkurat hvordan funksjonene brukes
som både objekter og verdier og klasser og alt.
Det gjør det mye enklere å forstå hva som skjer
på potensielt i biblioteker som du bruker
og debugger kode og kunne å ikke stanger hodet
mot veggen fordi du forstår ikke hvordan
forskjellige stykker jobber, så.