Scope of Objects in ECMAScript

Scope verwijst naar het bereik van variabelen.

Publieke, private en beschermde scopes

Concept

In de traditionele objectgeoriënteerde programmatuur ligt de nadruk op publieke en private scopes. Eigenschappen in de publieke scope zijn toegankelijk van buiten het object, dat wil zeggen, nadat de ontwikkelaar een instantie van het object heeft gemaakt, kunnen de publieke eigenschappen ervan worden gebruikt. Eigenschappen in de private scope zijn alleen toegankelijk binnen het object, dat wil zeggen, voor de buitenwereld bestaan deze eigenschappen niet. Dit betekent dat als een klasse private eigenschappen en methoden definieert, de subklasse deze eigenschappen en methoden ook niet kan bereiken.

Beschermde scope wordt ook gebruikt om private eigenschappen en methoden te definiëren, maar deze eigenschappen en methoden kunnen ook door de subklasse worden bereikt.

ECMAScript heeft alleen een publieke scope

Het bespreken van deze scope in ECMAScript is bijna zinloos, omdat er in ECMAScript maar één soort scope bestaat - de publieke scope. Alle eigenschappen en methoden van alle objecten in ECMAScript zijn publiek. Daarom moet men bij het definiëren van eigen klassen en objecten uiterst voorzichtig zijn. Onthoud, alle eigenschappen en methoden zijn standaard publiek!

Voorstel tot oplossing

Vele ontwikkelaars hebben online effectieve patronen voor eigenschapsbereik voorgesteld die dit probleem van ECMAScript oplossen.

Vanwege het ontbreken van een privé-bereik, heeft de ontwikkelaar een convenant opgesteld dat aangeeft welke eigenschappen en methoden als privé moeten worden beschouwd. Dit convenant bepaalt dat er een onderstreping voor en achter de eigenschappen moet worden geplaatst:

obj._color_ = "blue";

In deze code is de eigenschap color privé. Opmerking: de onderstreping wijst niet op het feit dat de eigenschap een publieke eigenschap is, het laat alleen andere ontwikkelaars weten dat deze eigenschap als privé moet worden beschouwd.

Sommige ontwikkelaars gebruiken graag een enkel onderstrepingsteken om private leden aan te geven, bijvoorbeeld: obj._color.

Statistische scope

Eigenschappen en methoden die door statische scope worden gedefinieerd kunnen altijd van dezelfde plek worden bereikt. In Java kan een klasse eigenschappen en methoden hebben zonder dat het object van die klasse hoeft te worden geïnstanceerd om deze eigenschappen en methoden te kunnen bereiken, bijvoorbeeld java.net.URLEncoder, waar de functie encode() een statische methode is.

ECMAScript heeft geen statische scope

StRICT genomen heeft ECMAScript geen statische scope. Het kan echter eigenschappen en methoden leveren voor constructiefuncties. Herinner je je nog, een constructiefunctie is een functie. Een functie is een object, en objecten kunnen eigenschappen en methoden hebben. Bijvoorbeeld:

function sayHello() {
  alert("hello");
}
sayHello.alternate = function() {
  alert("hi");
}
sayHello();		//Uitvoer "hello"
sayHello.alternate();	//Uitvoer "hi"

TIY

Hier is de methode alternate() eigenlijk een methode van de functie sayHello. Je kunt sayHello() aanroepen zoals een reguliere functie om "hello" uit te voeren, of je kunt sayHello.alternate() aanroepen om "hi" uit te voeren. Toch is alternate() een methode in de algemene scope van sayHello(), niet een statische methode.

Keyword this

Functie van this

Een van de belangrijkste concepten die je moet begrijpen in ECMAScript is de gebruik van het keyword this, dat wordt gebruikt in objectmethoden. Het keyword this wijst altijd naar het object dat de methode aanroept, bijvoorbeeld:

var oCar = new Object;
oCar.color = "red";
oCar.showColor = function() {
  alert(this.color);
};
oCar.showColor();		//Uitvoer "red"

TIY

In de bovenstaande code wordt het keyword this gebruikt in de showColor() methode van het object. In deze omgeving is this gelijk aan oCar. De volgende code doet hetzelfde als de bovenstaande code:

var oCar = new Object;
oCar.color = "red";
oCar.showColor = function() {
  alert(oCar.color);
};
oCar.showColor();		//Uitvoer "red"

TIY

Reden om this te gebruiken

Waarom this gebruiken? Omdat het bij het instantiëren van objecten altijd onzeker is welke variabelen naam de ontwikkelaar zal gebruiken. Met this kan dezelfde functie overal meerdere keren worden gebruikt. Overweeg het volgende voorbeeld:

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();		//Uitvoer "red"
oCar2.showColor();		//Uitvoer "blue"

TIY

In de bovenstaande code wordt eerst de functie showColor() met this gedefinieerd, vervolgens worden twee objecten (oCar1 en oCar2) gemaakt, waarbij de color-eigenschap van een object "red" is ingesteld en de color-eigenschap van het andere object "blue" is ingesteld. Beide objecten krijgen de eigenschap showColor, die verwijst naar de oorspronkelijke showColor() functie (let op, er is hier geen naamprobleem, omdat een van hen een globale functie is en de andere een objecteigenschap). De showColor() van elk object wordt aangeroepen, de uitvoer van oCar1 is "red" en de uitvoer van oCar2 is "blue". Dit komt omdat de this-sleutelwoord in de functie gelijk is aan oCar1 wanneer oCar1.showColor() wordt aangeroepen. Wanneer oCar2.showColor() wordt aangeroepen, is het this-sleutelwoord in de functie gelijk aan oCar2.

Let op, bij het verwijzen naar eigenschappen van een object, moet je het this-sleutelwoord gebruiken. Bijvoorbeeld, als je de volgende code gebruikt, kan de showColor() methode niet worden uitgevoerd:

function showColor() {
  alert(color);
};

Als je geen object of this-sleutelwoord gebruikt om een variabele te verwijzen, ziet ECMAScript het als een lokale of globale variabele. Vervolgens zoekt de functie naar een lokale of globale variabele genaamd color, maar vindt deze niet. Wat gebeurt er dan? De functie toont "null" in een waarschuwing.