ECMAScript objektin soveltamisala
- Edellinen sivu Objektityypit
- Seuraava sivu Luokan tai objektin määrittäminen
Toimialue tarkoittaa muuttujien soveltamisala.
Julkinen, yksityinen ja suojattu toimialue
Konsepti
Perinteisessä suuntautuneessa ohjelmoinnissa keskitytään pääasiassa julkisiin ja yksityisiin toimialueisiin. Julkisten toimialueiden objektit voidaan käyttää ulkopuolelta, eli kun kehittäjä luo objektin esimerkin, hän voi käyttää sen julkisia ominaisuuksia. Vain yksityisiin toimialueisiin kuuluvat ominaisuudet ovat saatavilla objektin sisällä, eli nämä ominaisuudet eivät ole olemassa ulkopuolella. Tämä tarkoittaa, että jos luokka määrittää yksityisiä ominaisuuksia ja menetelmiä, sen aliluokat eivät voi käyttää näitä ominaisuuksia ja menetelmiä.
Suojattu toimialue käytetään myös yksityisten ominaisuuksien ja metodioiden määrittämiseen, mutta nämä ominaisuudet ja metodit ovat myös saatavilla niiden aliluokille.
ECMAScriptillä on vain julkinen toimialue
Ei ole juuri mitään järkeä keskustella ECMAScriptin näistä toimialueista, koska ECMAScriptissä on vain yksi toimialue - julkinen toimialue. Kaikilla ECMAScriptin objekteilla on kaikki ominaisuudet ja metodit julkisia. Siksi on erittäin tärkeää olla varovainen, kun määrittelet omia luokkia ja objekteja. Muista, että kaikki ominaisuudet ja metodit ovat oletusarvoisesti julkisia!
Ehdotus ratkaisusta
Monet kehittäjät ovat ehdottaneet tehokkaita ominaisuuden toimialueen malleja verkossa, jotka ratkaisevat tämän ECMAScriptin ongelman.
Koska yksityistä toimialuetta ei ole, kehittäjät ovat määrittäneet periaatteen, joka selittää, mitkä ominaisuudet ja metodit tulisi pitää yksityisinä. Tämä periaate määrittää, että ominaisuudet ja metodit määritellään alaviivalla:
obj._color_ = "blue";
Tässä koodissa, ominaisuus color on yksityinen. Huomaa, että alaviiva ei muuta ominaisuuden julkisuutta, se vain kertoo muille kehittäjille, että heidän tulisi katsoa ominaisuutta yksityisenä.
Jotkut kehittäjät pitävät myös yksinkertaisia alaviivoja yksityisten jäsenten selventämiseen, esimerkiksi obj._color.}
Staattinen sovellusalue
Staattisen sovellusalueen määrittämät ominaisuudet ja menetelmät voidaan aina käyttää samasta sijainnista. Java:ssa luokka voi olla ominaisuuksia ja menetelmiä, ilman että sitä tarvitsee instanssoida, esimerkiksi java.net.URLEncoder-luokka, jonka funktio encode() on staattinen metodi.
ECMAScriptillä ei ole staattista sovellusalueita
Tarkasti ottaen ECMAScriptillä ei ole staattista sovellusalueita. Se voi kuitenkin tarjota rakentajille ominaisuuksia ja menetelmiä. Muistatko, että rakentajat ovat vain funktioita. Funktiot ovat objekteja, ja objektit voivat olla ominaisuuksia ja menetelmiä. Esimerkiksi:
function sayHello() { alert("hello"); } sayHello.alternate = function() { alert("hi"); } sayHello(); // Tulostaa "hello" sayHello.alternate(); // Tulostaa "hi"
Tässä metodi alternate() on itse asiassa funktio sayHello metodi. voidaan kutsua sayHello() tavallaan, jolla tavallinen funktio tuottaa "hello", tai kutsua sayHello.alternate() tuottamaan "hi". Vaikka niin on, alternate() on sayHello() julkisessa sovellusalueessa oleva metodi, ei staattinen metodi.
Avainsana this
this:n toiminta
ECMAScriptissä yksi tärkeimmistä käsitteistä on avainsana this:n käyttö, joka käytetään objektin metodissa. Avainsana this viittaa aina kutsuttuun objektiin, esimerkiksi:
var oCar = new Object; oCar.color = "red"; oCar.showColor = function() { alert(this.color); }; oCar.showColor(); // Tulostaa "red"
Yllä olevassa koodissa avainsana this käytetään objektin showColor() metodissa. Tässä ympäristössä this on oCar. Seuraava koodi toimii samalla tavalla kuin yllä oleva koodi:
var oCar = new Object; oCar.color = "red"; oCar.showColor = function() { alert(oCar.color); }; oCar.showColor(); // Tulostaa "red"
Tämä on this:n käyttö syy
Miksi käytetään this:iä? Koska instanssoidettaessa objektia ei aina voida määrittää, mitä muuttujanimiä kehittäjä käyttää. Käyttämällä this:iä voidaan käyttää samaa funktiota useissa paikoissa. Ajattele seuraavaa esimerkkiä:
function showColor() { alert(this.color); }; var oCar1 = new Object; oCar1.color = "red"; oCar1.showColor = showColor; var oCar2 = new Object; oCar2.color = "blue"; oCar2.showColor = showColor; oCar1.showColor(); //tulostaa "red" oCar2.showColor(); //tulostaa "blue"
Yllä olevassa koodissa ensin määritellään funktio showColor(), sitten luodaan kaksi objektia (oCar1 ja oCar2), joissa toisen objektin color-ominaisuus on asetettu "red" ja toisen objektin color-ominaisuus on asetettu "blue". Molemmat objektit on annettu ominaisuus showColor, joka osoittaa alkuperäiseen showColor() -funktioon (huomaa, että tässä ei ole nimeämisongelmaa, koska toinen on globaali funktio ja toinen on objektin ominaisuus). Kun kutsutaan jokaisen objektin showColor(), oCar1:n tulostus on "red" ja oCar2:n tulostus on "blue". Tämä johtuu siitä, että kun kutsutaan oCar1.showColor(), funktiossa oleva this-kirjain on oCar1. Kun kutsutaan oCar2.showColor(), funktiossa oleva this-kirjain on oCar2.
Huomaa, että objektin ominaisuuksien viittaamiseen on käytettävä this-kirjainta. Esimerkiksi, jos käytetään seuraavaa koodia, showColor() -menetelmä ei voi suoritua:
function showColor() { alert(color); };
Jos objektia tai this-kirjainta ei käytetä muuttujien viittaamiseen, ECMAScript näkee sen paikallisena tai globaalina muuttujana. Tämän jälkeen funktio etsii nimeltä color olevaa paikallista tai globaalia muuttujaa, mutta ei löydä sitä. Mitä tapahtuu? Funktio näyttää varoituksessa "null".
- Edellinen sivu Objektityypit
- Seuraava sivu Luokan tai objektin määrittäminen