ECMAScript objektin soveltamisala

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"

Kokeile itse

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"

Kokeile itse

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"

Kokeile itse

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"

Kokeile itse

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".