Область действия объектов ECMAScript

Область действия指的是 переменной область действия.

Общая, частная и защищенная области действия

Концепция

В традиционном面向对象的 программировании основное внимание уделяется общим и частным областям действия. Свойства объектов в общей области действия могут быть доступны извне объекта, то есть после создания экземпляра объекта разработчик может использовать его общие свойства. Свойства в частной области действия доступны только внутри объекта, то есть для внешнего мира эти свойства не существуют. Это означает, что если класс определяет частные свойства и методы, то его подклассы не могут доступа к этим свойствам и методам.

Защищенная область действия также используется для определения частных свойств и методов, но эти свойства и методы могут быть доступны и для подклассов.

ECMAScript имеет только общую область действия

Обсуждение этих областей действия в ECMAScript почти毫无意义, потому что в ECMAScript существует только один вид области действия - общая область действия. Все свойства и методы всех объектов в ECMAScript являются общими. Поэтому при определении своих классов и объектов необходимо быть особенно внимательным. Запомните, что все свойства и методы по умолчанию являются общими!

Рекомендованное решение

Многие разработчики предложили эффективные модели области действия свойств, решающие эту проблему ECMAScript.

Из-за отсутствия частного домена разработчики установили соглашение, которое определяет, какие свойства и методы следует считать частными. Это соглашение требует добавления подчеркивания перед свойством и после него:

obj._color_ = "blue";

В этом коде, свойство color является частным. Обратите внимание, что подчеркивание не изменяет факт, что свойство является общим, оно просто информирует других разработчиков, что они должны рассматривать это свойство как частное.

Некоторые разработчики также предпочитают использовать одинарную обратную косую черту для обозначения私有ных членов, например: obj._color.

Статическое пространство имён

Свойства и методы, определённые в статическом пространстве имён, всегда можно получить доступ из одного и того же места. В Java класс может иметь свойства и методы, и их можно получить доступ, не инстанцируя объект этого класса, например, класс java.net.URLEncoder, его функция encode() — это статический метод.

ECMAScript не имеет статического пространства имён

Точнее говоря, ECMAScript не имеет статического пространства имён. Однако, он может предоставлять свойства и методы для конструкторов. Помните ли вы, что конструкторы — это просто функции. Функции — это объекты, а объекты могут иметь свойства и методы. Например:

function sayHello() {
  alert("hello");
}
sayHello.alternate = function() {
  alert("hi");
}
sayHello();		//вывод "hello"
sayHello.alternate();	//вывод "hi"

TIY

Здесь метод alternate() на самом деле является методом функции sayHello. Его можно вызывать, как обычную функцию, sayHello() для вывода "hello", или sayHello.alternate() для вывода "hi". Но все же, alternate() является методом в общедоступном пространстве имён функции sayHello(), а не статическим методом.

Ключевое слово this

Функция this

Одним из важнейших понятий в ECMAScript является использование ключевого слова this, которое используется в методах объектов. Ключевое слово this всегда указывает на объект, который вызвал этот метод, например:

var oCar = new Object;
oCar.color = "red";
oCar.showColor = function() {
  alert(this.color);
};
oCar.showColor();		//вывод "red"

TIY

В上游ом коде ключевое слово this используется в методе объекта showColor(). В этой среде this равно oCar. Ниже приведен код, который выполняет ту же функцию, что и выше:

var oCar = new Object;
oCar.color = "red";
oCar.showColor = function() {
  alert(oCar.color);
};
oCar.showColor();		//вывод "red"

TIY

Причины использования this

Почему используется这个词 this? Потому что при инстанцировании объекта всегда нельзя определить, какие переменные будут использоваться разработчиком. Используя this, можно повторно использовать одну и ту же функцию в нескольких местах. Рассмотрим следующий пример:

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();		//вывод "red"
oCar2.showColor();		//вывод "blue"

TIY

В приведенном выше коде сначала с помощью this определяется функция showColor(), затем создаются два объекта (oCar1 и oCar2), у одного объекта свойство color установлено в "red", у другого对象的 свойство color установлено в "blue". Оба объекта получили атрибут showColor, указывающий на исходную функцию showColor () (заметьте, что здесь нет проблемы с именованием, потому что один из них является глобальной функцией, а другой - свойством объекта). Вызов каждого объекта showColor() приводит к выводу "red" для oCar1 и "blue" для oCar2. Это потому, что при вызове oCar1.showColor() ключевое слово this в функции равно oCar1. При вызове oCar2.showColor() ключевое слово this в функции равно oCar2.

Обратите внимание, что при обращении к свойствам объекта необходимо использовать ключевое слово this. Например, если использовать следующий код, метод showColor() не сможет выполниться:

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

Если переменную не вызывать объектом или ключом this, ECMAScript будет рассматривать ее как локальную или глобальную переменную. Затем функция будет искать локальную или глобальную переменную с именем color, но не сможет найти ее. Каковы результаты? Функция покажет "null" в предупреждении.