Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
HTML и JavaScript.doc
Скачиваний:
19
Добавлен:
11.12.2018
Размер:
1.61 Mб
Скачать

Операторы

Кроме привычных операторов C++ в JS присутствует еще три, которым стоит уделить особое внимание.

Первый из них оператор идентичности “===” и неидентичности “!==”. Он отличается от оператора равенства большей строгостью сравнения.

Второй оператор — instanceof. Он позволяет проверять тип переменной. Это бывает необходимо для анализа аргументов функции. Пример его использования:

if (d instanceof Date) {alert ‘d is Date’;}

Третий оператор — void. Он возвращает значение undefined вместо значения оператора, перед которым он стоит. Это полезно, когда нужно выполнить некоторое действие (например, открыть новое окно) и при этом ничего не выводить в документ.

Инструкции

С инструкцией var мы уже познакомились, когда разбирались с описанием переменных. Но в JS существуют еще две интересных инструкции.

Первая из них — for/in. Это аналог foreach в C#, т.е. цикл перебора значений. Пример его использования:

var a = {x: 1, y: 2, z: 3};

for (x in a)

{

alert(x);

}

Вторая инструкция — with. Полный аналог with в Pascal. Она позволяет работать с некоторой цепочкой имен. Очень полезна во время работы с объектами, имеющими сложную структуру, поскольку значительно сокращается объем кода. Но из-за нее также снижается производительность. Это нужно учитывать при работе с большой нагрузкой.

ООП в JavaScript

Как было сказано ранее, JavaScript является объектным языком. Однако в синтаксисе JavaScript нет конструкции для описания класса, подобной той, которую используют в C++. Вместо этого используется возможность расширения объекта, благодаря которой к объекту можно добавлять различные свойства (поля и методы). Далее мы познакомимся с возможностями ООП в JavaScript более подробно.

Конструкторы

Для создания нового объекта в JavaScript используется оператор new. Сначала он создает пустой объект, а затем вызывает функцию, указанную после него, передавая ей созданный объект в виде ключевого слова new. Да, после слова new указывается не тип создаваемого объекта, а конструктор. В конструкторе происходит расширение объекта. Чтобы стало более понятно, рассмотрим пример описания конструктора:

function Rectangle(w, h)

{

this.width = w;

this.height = h;

}

var r1 = new Rectangle(1, 2);

var r1 = new Rectangle(11, 5);

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

Конструктор обычно не возвращает значение, но допускается возможность возвращать объект, который становится результатом выражения с new. При этом переданный конструктору объект уничтожается.

Прототипы

Мы уже попробовали добавлять поля к объектам. Но часто требуется добавлять методы. Предположим, что нам необходимо добавить метод, рассчитывающий площадь прямоугольника. Естественно попытаться сделать это с помощью следующего кода:

function Rectangle(w, h)

{

this.width = w;

this.height = h;

this.area = function() { return this.width * this.height; }

}

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

Специально для решения данной проблемы в JavaScript введено понятие прототипа. Чтобы не утомлять вас запутанными определениями, достаточно сказать, что прототип предназначен для хранения общей функциональности всех экземпляров какого-то класса.

Идея проста: прототип содержит общую функциональность, а каждый объект, которому требуется эта функциональность, ссылается на него. В результате получаем решение проблемы: все общее хранится в одном месте и доступно для использования всеми желающими объектам. Так построен механизм наследования в JS.

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

function Rectangle(w, h)

{

this.width = w;

this.height = h;

}

Rectangle.prototype.area = function() { return this.width * this.height; }

Но при использовании такого расширения бывает необходимо определить, принадлежит ли какое-либо свойство данному объекту или оно унаследовано из прототипа. Специально для этого существует метод hasOwnProperty(), которому нужно передать имя соответствующего свойства. Если свойство принадлежит объекту, метод вернет true, в противном случае — false.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]