ECMAScript objektskopa
- Föregående sida Objekttyp
- Nästa sida Definiera klasser eller objekt
Räckvidd innebär variablens tillämpningsområde.
Offentlig, privat och skyddad räckvidd
Koncept
I den traditionella objektorienterade programutvecklingen är huvudfokusen på offentliga och privata räckvidder.Egenskaper i den offentliga räckvidden kan åtkommas från utanför objektet, vilket innebär att när utvecklaren skapar en instans av objektet, kan de använda dess offentliga egenskaper.När det gäller den privata räckvidden kan egenskaperna bara åtkommas inom objektet, vilket innebär att för den yttre världen finns dessa egenskaper inte.Meaning att om en klass definierar privata egenskaper och metoder, kan dess underklasser inte åtkomma dessa egenskaper och metoder.
Skyddad räckvidd används också för att definiera privata egenskaper och metoder, men dessa egenskaper och metoder kan också åtkommas av dess underklasser.
ECMAScript har bara en offentlig räckvidd
Det är nästan meningslöst att diskutera dessa räckvidder i ECMAScript eftersom det bara finns en typ av räckvidd i ECMAScript - den offentliga räckvidden.Alla egenskaper och metoder för alla objekt i ECMAScript är offentliga.Därför måste man vara mycket försiktig när man definierar sina egna klasser och objekt.Mindra alla egenskaper och metoder är som standard offentliga!
Föreslagen lösning
Många utvecklare har på internet föreslagit effektiva egenskapsräckviddsmodeller som löser detta problem med ECMAScript.
Eftersom det saknas en privat räckvidd har utvecklaren fastställt en konvention som beskriver vilka egenskaper och metoder som bör betraktas som privata.Denna konvention innebär att lägga till understrecket före och efter egenskapen:
obj._color_ = "blue";
I detta kodsegment är egenskapen color privat.Observera att understrecket inte ändrar att egenskapen är en offentlig egenskap, det informerar bara andra utvecklare att de bör betrakta denna egenskap som privat.
Vissa utvecklare föredrar också att använda enstaka understreck för att ange privata medlemmar, till exempel: obj._color.
Statisk riktning
Egenskaper och metoder definierade av statisk riktning kan alltid nås från samma plats. I Java kan en klass ha egenskaper och metoder utan att behöva instansiera objektet för klassen, till exempel java.net.URLEncoder-klassen, där funktionen encode() är en statisk metod.
ECMAScript har ingen statisk riktning
Strikt taget har ECMAScript ingen statisk riktning. Men det kan ge konstruktörer egenskaper och metoder. Kom ihåg att konstruktörer bara är funktioner. Funktioner är objekt, och objekt kan ha egenskaper och metoder. Till exempel:
function sayHello() { alert("hello"); } sayHello.alternate = function() { alert("hi"); } sayHello(); // utskriver "hello" sayHello.alternate(); // utskriver "hi"
Här är metoden alternate() faktiskt en metod för funktionen sayHello. Den kan anropas som en vanlig funktion, till exempel att anropa sayHello() för att utskriva "hello", eller anropa sayHello.alternate() för att utskriva "hi". Även om så är fallet är alternate() en metod i den allmänna riktningen för sayHello() och inte en statisk metod.
Nyckelordet this
Funktionen hos this
En av de viktigaste koncepten att förstå i ECMAScript är användningen av nyckelordet this, som används i objektets metoder. Nyckelordet this pekar alltid på objektet som anropar metoden, till exempel:
var oCar = new Object; oCar.color = "red"; oCar.showColor = function() { alert(this.color); }; oCar.showColor(); // utskriver "red"
I ovanstående kod används nyckelordet this i objektets showColor() metod. I detta sammanhang är this lika med oCar. Följande kod fungerar på samma sätt som ovanstående kod:
var oCar = new Object; oCar.color = "red"; oCar.showColor = function() { alert(oCar.color); }; oCar.showColor(); // utskriver "red"
Anledningen till att använda this
Varför använda this? Eftersom det alltid är okänt vilken variabelnamn utvecklaren kommer att använda vid instansiering av objekt. Genom att använda this kan samma funktion användas på flera platser. Tänk på följande exempel:
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(); //Utmattning "red" oCar2.showColor(); //Utmattning "blue"
I ovanstående kod definieras först funktionen showColor() med this, och sedan skapas två objekt (oCar1 och oCar2), där en objekts egenskap color är satt till "red", och en annan objekts egenskap color är satt till "blue". Båda objekten tilldelas egenskapen showColor, som pekar på den ursprungliga showColor () -funktionen (observera att det inte finns något namnproblem här, eftersom en är en global funktion och den andra är en objektegenskap). När varje objekts showColor() anropas, är utmatningen för oCar1 "red" och för oCar2 är utmatningen "blue". Detta beror på att när oCar1.showColor() anropas, är this-kortet i funktionen lika med oCar1. När oCar2.showColor() anropas, är this-kortet i funktionen lika med oCar2.
Observera att du måste använda this-kortet för att hänvisa till egenskaper på objekt. Till exempel kan showColor() metoden inte köras om du använder följande kod:
function showColor() { alert(color); };
Om du inte använder objekt eller this-kortet för att hänvisa till variabler, kommer ECMAScript att betrakta det som en lokal eller global variabel. Då kommer funktionen att söka efter en lokal eller global variabel med namnet color, men kommer inte att hitta den. Hur blir det då? Funktionen kommer att visa "null" i en varning.
- Föregående sida Objekttyp
- Nästa sida Definiera klasser eller objekt