Bereich von ECMAScript-Objekten

Scope bezieht sich auf den Anwendungsbereich von Variablen.

Öffentlicher, privater und geschützter Scope

Konzept

In der traditionellen objektorientierten Programmierung wird hauptsächlich auf öffentliche und private Scope geachtet. Die Eigenschaften eines Objekts im öffentlichen Scope können von außen aufgerufen werden, d.h. nach der Erstellung eines Objekts kann deren öffentliche Eigenschaft verwendet werden. Die Eigenschaften im privaten Scope können nur im Objekt selbst aufgerufen werden, was bedeutet, dass diese Eigenschaften für die Außenwelt nicht existieren. Dies bedeutet, dass wenn eine Klasse private Eigenschaften und Methoden definiert, können diese nicht von Unterklassen aufgerufen werden.

Ein geschützter Scope wird ebenfalls verwendet, um private Eigenschaften und Methoden zu definieren, aber diese Eigenschaften und Methoden können auch von Unterklassen aufgerufen werden.

ECMAScript hat nur einen öffentlichen Scope

Eine Diskussion über diese Scope-Aspekte in ECMAScript ist fast bedeutungslos, da in ECMAScript nur ein Scope existiert - der öffentliche Scope. Alle Objekte in ECMAScript haben öffentliche Eigenschaften und Methoden. Daher muss bei der Definition eigener Klassen und Objekte besondere Sorgfalt walten. Denken Sie daran, dass alle Eigenschaften und Methoden standardmäßig öffentlich sind!

Vorschlägliche Lösung

Viele Entwickler haben im Internet effektive Muster für den Bereich von Eigenschaften vorgeschlagen, die dieses Problem in ECMAScript lösen.

Da es einen fehlenden privaten Bereich gibt, haben Entwickler eine Konvention festgelegt, die angibt, welche Eigenschaften und Methoden als privat betrachtet werden sollten. Diese Konvention sieht vor, dass vor und nach den Eigenschaften ein Unterstrichsymbol gesetzt wird:

obj._color_ = "blue";

In diesem Code ist die Eigenschaft color privat. Beachten Sie, dass das Unterstrichsymbol die Eigenschaft nicht in eine öffentliche Eigenschaft verwandelt, sondern nur anderen Entwicklern mitteilt, dass diese Eigenschaft als privat betrachtet werden sollte.

Einige Entwickler bevorzugen es auch, mit einem Einzellinie-Bindestrich private Mitglieder zu kennzeichnen, zum Beispiel: obj._color.

Statischer Scope

Attribute und Methoden, die durch statischen Scope definiert sind, können jederzeit von derselben Position aus aufgerufen werden. In Java können Klassen Attribute und Methoden haben, ohne dass ein Objekt der Klasse instanziert werden muss, um auf diese Attribute und Methoden zuzugreifen, zum Beispiel java.net.URLEncoder, deren Funktion encode() eine statische Methode ist.

ECMAScript hat keinen statischen Scope

Genau genommen hat ECMAScript keine statische Scope. Allerdings kann es Konstruktoren Attribute und Methoden bereitstellen. Erinnern Sie sich daran, dass Konstruktoren nur Funktionen sind. Funktionen sind Objekte, und Objekte können Attribute und Methoden haben. Zum Beispiel:

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

TIY

Hier ist die Methode alternate() tatsächlich eine Methode der Funktion sayHello. Man kann sayHello() wie eine normale Funktion aufrufen, um "hello" auszugeben, oder man kann sayHello.alternate() aufrufen, um "hi" auszugeben. Trotzdem ist alternate() eine Methode im öffentlichen Bereich von sayHello(), nicht eine statische Methode.

Schlüsselwort "this"

Funktion von "this"

Eine der wichtigsten Konzepte in ECMAScript ist die Verwendung des Schlüsselworts "this", das in Methoden von Objekten verwendet wird. Das Schlüsselwort "this" bezieht sich immer auf das Objekt, das die Methode aufruft, zum Beispiel:

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

TIY

In dem obigen Code wird das Schlüsselwort "this" in der Methode showColor() des Objekts verwendet. In diesem Kontext ist "this" gleich oCar. Das folgende Code ist funktional identisch zum obigen Code:

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

TIY

Gründe für die Verwendung von "this"

Warum wird "this" verwendet? Weil man sich bei der Instanziierung eines Objekts nie sicher sein kann, welche Variablennamen der Entwickler verwenden wird. Mit "this" kann dieselbe Funktion an mehreren Stellen wiederverwendet werden. Überlegen Sie sich das folgende Beispiel:

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

TIY

Im obigen Code wird zunächst die Funktion showColor() mit dem Schlüsselwort this definiert, dann werden zwei Objekte (oCar1 und oCar2) erstellt, deren Eigenschaft color mit "red" und "blue" belegt wird. Beide Objekte haben die Eigenschaft showColor, die auf die ursprüngliche Funktion showColor () verweist (beachten Sie, dass es hier kein Namensproblem gibt, da eine globale Funktion und eine Eigenschaft des Objekts sind). Wenn showColor() von jedem Objekt aufgerufen wird, gibt oCar1 "red" aus und oCar2 gibt "blue" aus. Dies liegt daran, dass das Schlüsselwort this im Function-Objekt beim Aufruf oCar1.showColor() oCar1 ist. Beim Aufruf oCar2.showColor() ist das Schlüsselwort this im Function-Objekt oCar2.

Beachten Sie, dass beim Verweisen auf Eigenschaften eines Objekts der Schlüsselwort this verwendet werden muss. Zum Beispiel kann die Methode showColor() nicht ausgeführt werden, wenn der folgende Code verwendet wird:

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

Wenn Variablen nicht mit dem Objekt oder dem Schlüsselwort this referenziert werden, wird ECMAScript sie als lokale oder globale Variablen betrachten. Der folgende Code sucht nach einer lokalen oder globalen Variable namens color, aber findet sie nicht. Was passiert? Der Code zeigt im Warnfenster "null" an.