Zasięg obiektów ECMAScript

Zakres to zakres zastosowania zmiennych.

Publiczny, prywatny i chroniony zakres

Koncepcja

W tradycyjnym projektowaniu programów obiektowych, głównym naciskiem jest zakres publiczny i prywatny. Atrybuty w zakresie publicznym mogą być dostępne z zewnętrznej strony obiektu, co oznacza, że po utworzeniu instancji obiektu, można używać jego publicznych atrybutów. Atrybuty w zakresie prywatnym są dostępne tylko wewnątrz obiektu, co oznacza, że dla świata zewnętrznego te atrybuty nie istnieją. Oznacza to, że jeśli klasa definiuje prywatne atrybuty i metody, jej podklasy również nie mogą dostępu do tych atrybutów i metod.

Chroniony zakres jest również używany do definiowania prywatnych atrybutów i metod, ale te atrybuty i metody mogą być również dostępne dla podklas.

ECMAScript ma tylko zakres publiczny

Dyskusja na temat tych zakresów w ECMAScript prawie nie ma znaczenia, ponieważ w ECMAScript istnieje tylko jeden zakres - publiczny. Wszystkie obiekty w ECMAScript mają publiczne atrybuty i metody. Dlatego, gdy definiujesz własne klasy i obiekty, musisz być bardzo ostrożny. Pamiętaj, że wszystkie atrybuty i metody są domyślnie publiczne!

Sugestia rozwiązania

Wiele deweloperów zaproponowało efektywne modele zakresu atrybutów, które rozwiązują ten problem w ECMAScript.

Z powodu braku prywatnego zakresu, deweloperzy ustalili konwencję, która określa, które atrybuty i metody powinny być traktowane jako prywatne. Ta konwencja wymaga dodania podkreślenia przed atrybutami:

obj._color_ = "blue";

W tym kodzie, atrybut color jest prywatny. Uwaga, podkreślenie nie zmienia faktu, że atrybut jest publiczny, ale informuje innych deweloperów, że powinni traktować go jako prywatny.

Niektórzy deweloperzy lubią również używać jednoliterowego podkreślenia do oznaczania prywatnych członków, na przykład: obj._color。

Statyczny zakres

Atrybuty i metody zdefiniowane w statycznym zakresie można w każdej chwili uzyskać z tego samego miejsca. W Javie, klasy mogą mieć atrybuty i metody, które można uzyskać bez instancjalizacji obiektu tej klasy, na przykład klasa java.net.URLEncoder, jej funkcja encode() jest metodą statyczną.

ECMAScript nie ma statycznego zakresu

Dokładnie rzecz biorąc, ECMAScript nie ma statycznego zakresu. Jednak może on dostarczać atrybuty i metody do konstruktora. Pamiętasz, że konstruktory to tylko funkcje. Funkcje są obiektami, a obiekty mogą mieć atrybuty i metody. Na przykład:

function sayHello() {
  alert("hello");
}
sayHello.alternate = function() {
  alert("hi");
}
sayHello();		// wyświetla "hello"
sayHello.alternate();	// wyświetla "hi"

TIY

Tutaj, metoda alternate() jest metodą funkcji sayHello. Można ją wywołać tak jak zwykłą funkcję, aby wyświetlić "hello", lub wywołać sayHello.alternate() aby wyświetlić "hi". Mimo to, alternate() jest metodą w publicznym zakresie działania sayHello(), a nie metodą statyczną.

Kluczowe słowo this

Funkcje this

Jednym z najważniejszych pojęć do opanowania w ECMAScript jest użycie kluczowego słowa this, który jest używany w metodach obiektu. Kluczowe słowo this zawsze wskazuje na obiekt, który wywołuje daną metodę, na przykład:

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

TIY

W powyższym kodzie, kluczowe słowo this używane jest w metodzie showColor() obiektu. W tym środowisku, this równa się oCar. Poniższy kod działa w ten sam sposób jak powyższy:

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

TIY

Przyczyny użycia this

Dlaczego używać this? Bo w momencie instancjalizacji obiektu nigdy nie można być pewnym, jakie nazwy zmiennych użyje deweloper. Dzięki użyciu this, tę samą funkcję można powtórzyć w wielu miejscach. Pomyśl o poniższym przykładzie:

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

TIY

W powyższym kodzie, najpierw zdefiniowano funkcję showColor() za pomocą this, a następnie utworzono dwa obiekty (oCar1 i oCar2), w którym właściwość color ustawiona jest na "red", a w drugim obiektu właściwość color ustawiona jest na "blue". Obiektom przypisano właściwość showColor, wskazującą na oryginalną funkcję showColor () (zwróć uwagę, że nie ma tu problemu z nazewnictwem, ponieważ jeden jest funkcją globalną, a drugi właściwością obiektu). Wywołanie showColor() dla każdego obiektu, oCar1 wyświetla "red", a oCar2 wyświetla "blue". To dlatego, że podczas wywoływania oCar1.showColor(), klucz this w funkcji równa się oCar1. Podczas wywoływania oCar2.showColor(), klucz this w funkcji równa się oCar2.

Uwaga, przy odniesieniu do właściwości obiektu, musisz użyć klucza this. Na przykład, jeśli użyjesz poniższego kodu, metoda showColor() nie będzie działać:

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

Jeśli nie użyjesz obiektu lub klucza this do odniesienia do zmiennej, ECMAScript uważa ją za zmienną lokalną lub globalną. Następnie funkcja szuka lokalnej lub globalnej zmiennej o nazwie color, ale jej nie znajduje. Jak to wygląda? Funkcja wyświetli "null" w ostrzeżeniu.