Logotyp för Björns studiewebb

Objekt (JS)

Innehåll

På denna hemsida beskrivs några av de klasser som finns i JavaScript och de objekt som motsvarar webbläsarens olika delar. Beskrivningar är inte kompletta, d.v.s. det finns eventuellt fler egenskaper och metoder än de som visas på denna webbsida. Observera också att objekten (inte klasserna) är en del av den s.k. "DOM Level 0-modellen", d.v.s. från tiden innan tillverkare av webbläsare (läs Micro$oft) kunde komma överens om en gemensam modell för objekt i webbläsare. Detta är ett problem då måste skriva speciell kod för att kod ska fungera i Internet Explorer respektive övriga (Firefox, Google Chrome, Opera och Safari). (Detta är nu löst i.o.m. introduktionen av DOM - se sidan DOM.)

Objekten beskrivs på denna webbsida för att ge en "komplett bild" av JavaScript, d.v.s. det är mycket troligt att du hittar dem i exempel på Internet samt att vissa objektrelaterade saker på denna webbsida är användbara, skulle man inte vilja lära sig DOM. :-)

JavaScript är främst, enligt mig, ett s.k. objektbaserat språk, d.v.s. det finns klasser och redan existerande objekt, men vi skapar inga egna klasser eller objekt (annat än vektorer, arrays). I JavaScript används klasser för att samla "funktioner" (eller metoder, som är den korrekta termen) och mer komplexa saker (d.v.s. innehåller flera värden) motsvaras av objekt. (Se Klasser och objekt sist på denna sida för en kort jämförelse.)

Sen jag skapade min första version av denna underwebb så har jag börjat misstycka om titeln på denna webbsida: Objekt. Ett bättre namn vore "Klassmetoder och -egenskaper samt webbläsarobjekt", vilket är lite långt. :-)

Klasser

Det finns ett antal klasser i JavaScript och de används främst för dess egenskaper (eller konstanter) och metoder ("funktioner"), med undantag från klassen Array som vi skapar instanser (objekt) av (från). Namn på klasser i JavaScript börjar med en versal, t.ex. Math och String. Nedan beskrivs klasser efter den ordning som de (eller dess egenskaper/metoder) används mest.

Innan vi tittar på klasser så förklaras begreppen egenskaper och metoder.

Egenskaper och metoder

En egenskap är ett värde och metod är en "funktion". En person har t.ex. ett födelseår, vilket är en egenskap. Skulle det finnas ett personobjekt så skulle vi t.ex. kunna fråga den om dess ålder genom att skriva person.fodelsear. Vi använder något som kallas för punktnotation, d.v.s. att vi skriver namn på objekt (eller klass) och sen egenskap (eller metod) som vi vill använda.

En del egenskaper är s.k. konstanter (värden som inte kan ändras), vilka skrivs med versaler som standard. T.ex. så finns värdet för det matematiska talet pi (3,14..., fast enligt amerikansk standard: 3.14...:-) definierat i klassen Math som Math.PI.

En metod ("funktion") gör något, d.v.s. vi vill att något ska hända när vi anropar metoder. I exempel med personobjekt skulle vi t.ex. kunna vilja att person pratade eller gick och skulle då skriva något i stil med person.prata() respektive person.ga(). För att skilja metoder från egenskaper, och då vi ibland skickar argument till metoder, så följs metodanrop av parenteser.

Man skiljer även på instans- och klassegenskaper/-metoder, d.v.s. vad som ska skrivas före punkten (Klassnamn.egenskap respektive objektVar.egenskap). De flesta egenskaper och metoder på denna webbsida är instansegenskaper och -metoder, d.v.s. det ska vara en variabel med ett objekt före punkt. Om det är en klassegenskap eller -metod så markeras detta tydligt på denna webbsida.

I beskrivningar av klasser och objekt nedan visas först egenskaper i en lista följt av metoder i ytterligare en lista.

Klassen String

Strängar (text) är vanligt förekommande i programmering och ofta finns ett behov av att manipulera strängar, t.ex. hitta en sträng i en sträng, titta på varje bokstav i en sträng eller omvandla till versaler/gemener. Nedan visas exempel på några metoder i klassen String.

En viktig sak att komma ihåg om strängar att de i vissa fall påminner om vektorer, bl.a. att strängar är "nollbaserade" - första position (index) i en vektor är noll. När vi anropar metoder nedan, som returnerar position, så är första positionen 0, andra positionen 1, o.s.v..

Egenskaper

Egenskapen length är användbar för att t.ex. avgöra om en sträng i ett formulärs textruta är långt nog (t.ex. postnummer innehåller fem tecken - se sidan Formulär). Egenskapen kan även användas för att "loopa över" en sträng, d.v.s. lika många gånger som längd på sträng.

var minStrang = "Hej!";
for(i = 0; i < minStrang.length; i++)
{
  ...;
}

Metoder

JavaScript är, som sagt, praktiskt att använda för att validera (verifiera) data i formulär. Detta involverar ofta att undersöka varje tecken i en sträng, något vi kan göra med metoden charAt(pos) i kombination med egenskapen length, d.v.s. i loop i exempel ovan (se sidan Formulär för exempel).

Metoden indexOf(str) kan t.ex. användas för att kontrollera att @-tecknet i en e-postadress inte är första tecken samt att det finns en punkt efter @-tecknet (d.v.s. att det finns en domän och huvuddomän, så som .se, efter @-tecknet).

var epost = "namn@domän.se";
if(epost.indexOf("@") > 0)
  alert('Namn för e-postadress har angivits.');

Exempel 3.1 - Klassen String

Till början på sida

Klassen Date

Datum är alltid användbart..:-) Man kan t.ex. infoga datum i webbsidor så att man vet att besökaren för dagens datum på eventuella utskrifter (se exempel nedan). Datum är även användbart för att visa när webbsidor (dokument) senast uppdaterades, vilket vi kan man använda metoden lastModified() i objektet document (se mer nedan).

Observera att vissa metoder nedan fungerar olika i olika webbläsare och att programmering med datum är en källa till många fel i kod! Ytterligare en detalj att observera är att stöd för datumformat, d.v.s. hur datum skrivs, varierar och att det amerikanska datumformatet (månad/dag/år) är det som verkar fungera bäst! En tredje detalj att observera är att "datum" oftast är samma sak som datum och tid! Så även om du tror att du jämför två datumobjekt med lika värden så kan de skilja sig åt då deras tid är olika. Testa därför resultatet i de webbläsare som du tänker stådja!

Innan vi kan använda de flesta metoder nedan så måste vi skapa en instans (ett objekt) av klassen Date, vilket görs med nedanstående kod. Variabeln objDate kommer alltså innehålla ett datumobjekt.

var objDate = new Date();

Egenskaper

Metoder

Metoder som börjar med "get" brukar returnera ett värde och för varje get-metod så finns det oftast en motsvarande set-metod för att ange motsvarande värde, t.ex. getDate() och setDate(värde). (Därför visas endast get-metoder nedan.)

Nedanstående kod skriver ut dagens datum (se resultat under kod). Här börjar vi med att skapa ett nytt datumobjekt, som placeras i variabeln objDate, med vilken vi kan hämta ("fullt") årtal (d.v.s. fyra siffror), nummer på månad samt dag i månad. Observera att månaden januari har värdet noll och december elva, d.v.s. vi måste öka på värdet som getMonth() returnerar och här används parenteser för att addition ska ske istället för konkatinering (sammanslagning av strängar). Exempel visar även att vi ibland bör "snygga till" utskrifter - i detta fall borde vi skriva ut en extra nolla om månad endast innehåller en siffra.

var objDate = new Date();
var strDate = objDate.getFullYear() + "-"
  + (objDate.getMonth()+1) + "-" 
  + objDate.getDate();

Resultat från kod ovan (om kod fungerar i din webbläsare):

Exempel 3.2 - Klassen Date

Till början på sida

Klassen Math

Klassen Math är inte en klass man skapa objekt från, utan man använder klassens (statiska) metoder för diverse matematiska funktioner.

Egenskaper

Metoder

Några exempel på metoder vissa nedan.

Det finns även funktioner för vinklar (d.v.s. cos, sin och tan), skulle vi behöva jobba med geometri.

Exempel 3.3 - Klassen Math

Till början på sida

Klassen Array

Klassen Array är alltså den udda klassen (på denna webbsida) då den används för att skapa instanser (objekt) av, d.v.s. vektorer. För en beskrivning av hur man skapar och lägger till värden (element) i vektorer, m.m., se hemsidan Språket. Nedan beskrivs olika egenskaper och metoder som finns i objekten (vektorerna).

Egenskaper

Egenskapen length är mycket användbar, speciellt i for-loopar. I exempel nedan så skapas en vektor (storlek är irrelevant, men 5 här) som sen fylls med tal (på något sätt). Sen loopar vi "över" vektorn, d.v.s. vi loopar lika många gånger som det finns positioner i vektorn, och summerar alla talen.

Observera att eftersom loopens block endast innehåller en sats så kan vi utelämna "hakparenteserna". Operatorn += ökar på variabeln summa med innehållet i vektorn på position i, d.v.s. vi kunde ha skrivit summa = summa + vekt[i].

var vekt = new Array(5);
var summa = 0;
//kod som fyller vektor med tal
for(int i = 0; i < vekt.length; i++)
    summa += vekt[i];

Metoder

En trevlig finess, för oss vana programmerare, är att vi kan använda en vektor i JavaScript som en s.k. stack eller kö m.h.a. metoderna push, pop och shift.

En stack fungerar som tallrikshållarna i matbespisningen på skolan: man lägger till (push) tallrikar på toppen, vilket puttar ner tidigare tallrikar, och tar (pop) tallrikar från toppen, vilket höjer upp efterföljande tallrikar. (Detta kallas även för LIFO: last in, first out.) Köer fungerar som i verkligheten: först in, först ut (FIFO: fist in, first out). Två konstruktion som är mycket praktiska i viss programmering.

Till början på sida

Objekt i webbläsare

I JavaScript (i webbläsare) finns ett antal objekt som motsvarar webbläsare och (X)HTML-dokument. Namnen på variabler som refererar till dessa objekt skrivs med gemen i början (t.ex. navigator och document). Objekten innehåller ett antal egenskaper och metoder, samt några även händelser (events). En händelse är något som kan ske, t.ex. att sida laddas eller musmarkör förs över eller bort från ett element. (Se sidan Händelser för hur man använder dessa händelser.)

Objektet navigator

Objektet navigator motsvara besökarens webbläsare och information som kan fås från webbläsaren är bl.a. dess namn och version. Eftersom Internet Explorer respektive övriga webbläsare fungerar på lite olika sätt när man ska komma åt en del webbläsarobjekt, så kan man använda t.ex. namnet och/eller version på webbläsaren kan för att t.ex. köra olika kod. (Använder vi DOM istället så finns det bättre sätt att lösa detta problem - se sidan DOM.)

Egenskaper

De flesta webbläsare idag använder kodnamnet Mozilla, men vi kan använda egenskaperna appName eller userAgent för att ta reda på tillverkare av klient. Observera att bl.a. Firefox identifierar sig som Netscape samt att en del webbläsare.....

Metoder

Exempel 3.4 - Objektet navigator

Till början på sida

Objektet window

Precis som navigator motsvarar webbläsaren så motsvaras windows av själva fönstret där hemsidan visas. Om man använder ramar så är varje ram ett fönster, d.v.s. det finns ett window-objekt för varje ram i webbläsaren.

För de flesta egenskaperna och metoderna behöver man inte skriva "window." framför - det läggs till av JavaScript-tolken. Nedan visas exempel på några egenskaper, metoder och händelser för objektet window. Några av metoderna har vi redan behandlat, främst de som visar dialogrutor.

Exempel 3.5 - Objektet window

Till början på sida

Objektet document

Varje fönster innehåller ett dokument och objektet document motsvarar dokument samt är "underordnat" objektet window. Objektet är ett av de mesta använda, i.a.f. dess metoder write() och writeln() som behandlats tidigare. I Navigator är den enda färgen som kan ändras med JavaScript bakgrundsfärgen när hemsidan laddat klart.

För att visa egenskapen referrer så visas här hemsidan som länkade till denna och som besökaren klickade på för att se denna hemsida:

Detta dokument innehåller ett exempel på hur man kan använda metoden open(). I exempeldokumentet finns kod som visar hur write(), writeln() och close() fungerar.

Exempel 3.6 - Objektet document

Till början på sida

Objektet history

Egenskapen history...

För att visa hur man kan be webbläsaren hoppa tillbaka ett steg så kan du klicka på denna länk: <<Tillbaka. Värdet för attributet href i taggen a är "javascript:history.back()". (Klicka på Framåt/Forward för att komma tillbaka till denna hemsida om ni klickar på <<Tillbaka ovan!)

Exempel 3.7 - Objektet history

Till början på sida

Objektet location

Objektet innehåller bl.a. information om webbserver och dokumentets sökvägen till dokumentet.

Exempel 3.8 - Objektet location

Till början på sida

Egna objekt

I JavaScript kan man skapa egna objekt (eller snarare klasser som man skapar objekt från) om man vill. Klasserna existerar endast så länge som besökaren har webbsidan öppen (eller snarare så länge någon kod exekverar i sidan :-).

Jag kommer inte att behandla dessa (eventuell kommer jag skriva om detta stycke någon gång i framtiden).

Till början på sida

Objekt och klasser

Detta avsnitt behandlar teorin bakom en del av programmeringen i JavaScript, d.v.s. du kan skippa detta avsnitt om du inte vill förstå varför vissa saker är och fungerar som de gör i JavaScript. :-)

Förlåt, men jag känner att jag inte kan gå vidare utan att ge mig in på (relevanta delar av) programmeringens historia... eller i.a.f. ge dig möjligheten att lösa om det, skulle du vara intresserad. :-) Skälet är att jag vill försöka förklara vad ett objektbaserat språk är, vilket JavaScript är enligt mig (i.a.f. med tanke på hur de flesta använder språket).

Strukturerad programmering

Strukturerad programmering bygger på tre saker och de används i de flesta programmeringsspråk (strukturerat eller objektorienterat), nämligen:

Dessa tre saker kan kombineras i oändligt antal kombinationer för att skapa program.

Tack vare funktioner så kan vi även strukturera kod bättre samt undvika upprepande kod. En funktion är (kort) en bit kod som vi kan referera till (anropa) m.h.a. ett namn. (Se sidan Språket för hur funktioner definieras och anropas.) Genom att skapa funktioner så kan vi bl.a. bryta ner problemet (som utveckling av ett program är) i mindre delar samt placera kod som upprepas på ett ställe (så att vi bara behöver ändra på ett ställe, skulle vi hitta ett fel i kod eller vilja ändra programmets funktion).

Objektorienterad (OO) programmering

OO-programmering bygger vidare på strukturerad programmering, d.v.s. vi använder fortfarande de grundläggande koncepten sekvens, selektion och iteration. Men OO bygger vidare och introducerar två nya begrepp: klasser och objekt (vilka är revolutionerande och framtiden, skulle vi använda dem fullt ut :-).

En klass är en mall för att skapa objekt och används för att definiera beteende (funktion) hos objekt av klassen. Klasser kan även innehålla metoder ("funktioner") och egenskaper (värden eller konstanter). (Dessa metoder och egenskaper kan användas utan att skapa objekt - se mer nedan.)

Objekt är instanser (förekomster) av klasser samt har egenskaper och metoder ("funktioner") som vi kan använda för att fråga om, och ändra, (enskilda) objekts tillstånd ("värden"). (Metoder och egenskaper har, som sagt, definierats i klassen enligt förra stycket. Men egenskaperna är unika för respektive objekt av klassen som skapas.)

Det här med klasser och objekt, d.v.s. objektorientering, kräver ett nytt tankesätt, vilket (till stor del) inte är relevant för oss JavaScript-programmerare att förstå. :-) Det enda vi behöver förstå är varför vi skriver på ett visst sätt ibland (när vi använder funktioner) och på ett annat sätt (när vi använder metoder i objekt eller klasser). Enklast är att visa med ett exempel.

OO-exempel

En person (objekt) vet vilket är den är född (egenskap) och om jag frågar personen hur gammal den är (metod) så kan personen (objektet) räkna ut hur gammal den är. Vilket år det är kan personen (objektet) fråga (metod) kalendern (eller, i datatermer, klassen Date). "Översatt" till JavaScript så skulle vi kunna skriva följande kod:

var fodelsear = 2000;
var aktuelltAr = new Date().getFullYear(); //Hämta år med 4 siffror
var alder = aktuelltAr - fodelsear; //=> 17 år när detta skrivs

Ålder för person född år 2000:

(Om vi skapar flera personobjekt så har de varsitt värde på egenskapen födelseår, d.v.s. de kan vara födda olika år och därmed ha olika ålder.)

Objekt och deras metoder och egenskaper

Vad jag vill visa med exempel ovan (men inte själva JavaScript-koden :-) är att vissa saker (egenskaper) är en del av objekt. Ett typiskt exempel på detta är en vektor (array, som är ett objekt) som själv vet hur lång den är (egenskapen length). För att fråga ett objekt om värdet på en egenskap så använder man följande syntax (kallat punktnotation):

var min_var = objekt.egenskap;

Exempel ovan säger "snälla objekt, ge mig värdet på din egenskap". Objektet (med egenskapen) skrivs alltså först och följs av en punkt och namnet på egenskap vi vill komma åt. (Observera att egenskapens namn inte följs av parenteser! Parenteser används endast om det är en metod, vilket behandlas härnäst.)

Objekt kan även ha metoder ("funktioner"), vilket och vi såg exempel på detta redan på sidan Grundläggande: utskrift till dokument med write-metoderna (document.write(text)). Vi kan även se exempel på metodanrop, när klassen Array behandlades ovan, där vi lärde oss att vi kan anropa metoden reverse för att kasta om ordningen på vektorers element. Metoder i objekt anropas på samma sätt som vi använder egenskaper i objekt, men vi lägger till parenteser (med eventuella argument mellan).

Precis som med funktioner så kan metoder returnera ett värde.

objekt.metod(argument1, argument2, ...);

Klasser och deras metoder och egenskaper/konstanter

Även klasser kan ha metoder och egenskaper, vilket vi sett exempel på denna webbsida när vi tittade på klasser som Math och Date. Egenskaper och metoder anropas på samma sätt som för objekt (d.v.s. med punktnotation) men vi ersätter objekt med klassers namn.

Objektbaserade språk

I ett s.k. objektbaserat språk använder vi främst strukturerad programmering, men det finns även ett antal klass och objekt (d.v.s. det är en "blandning"). Objektbaserade språk identifieras genom att vi främst bara använder existerande objekt (så som document och window) samt använda s.k. klassmetoder (metoder, eller "funktioner", i klasser som Date och String) men aldrig skapar egna klasser.

Sammanfattningsvis...

Vad vi (främst) behöver veta är att språket JavaScript har objektorienterade egenskaper och vi måste skilja på om det är en funktion eller metod (i objekt eller klass) som vi anropar:

Skälet till varför jag ville ta upp ämnet i detta avsnitt, skulle du ha löst hit, är bl.a. då personer som jag, skolade i både strukturerad och objektorienterad programmering, ibland har svårt för språk som JavaScript som är någon form av "hybrid" eller blandning. Många nybörjare har även problem att förstå när de ska använda punktnotation med objekt/klasser eller bara "funktionsnamnet" (d.v.s. inte en metod, något som oftast är samma sak för nybörjaren).

Nåja, dags att sluta och svamla och återgå till mer praktiska saker. :-)

Till början på sida

Referenser

Nedan finns några webbsidor/-platser med mer information om ämnet på denna webbsida.