3. Объекты в JavaScript.
Язык JavaScript основан на упрощенной объектно-ориентированной парадигме. Конструкция объектов состоит из свойств (properties), которые являются переменными языка JavaScript. Свойства в свою очередь могут быть объектами. Функции, ассоциированные с объектами, называют методами объектов. В дополнение к встроенным объектам клиент-навигатора пользователь может сам создавать собственные объекты.
3.1. Объекты и свойства.
Объектам языка JavaScript соответствуют ассоциированные с ними свойства. Доступ к свойствам объекта осуществляется в простой нотации:
objectName.propertyName, где:Определение свойства заключается в задании его значения (value). Например, предположим, что существует объект с именем myCar (обсуждение о создании объектов будет позже, предположим лишь, что данный объект уже существует). Зададим его свойства make (производитель), model (модель) и year (год производства) в следующем виде:
myCar.make = "Ford"
myCar.model = "Mustang"
myCar.year = 69;
Возможно обращение к определенным таким образом свойствам также следующим образом:
mycar["make"] = "Ford
myCar["model"] = "Mustang"
myCar["year"] = 69;
Тип такого рода массивов называют ассоциативными массивами, поскольку каждый индексируемый элемент массива ассоциирован с строчным значением типа string. Проиллюстрировать как работает подобная конструкция можно следующим образом. Запрограммируем функцию, которая будет высвечивать свойства объекта, имя которого передается функции в качестве ее аргумента:
function show_props(obj, obj_name) {Таким образом, при обращении к функции show_props(myCar, "myCar") возвращаемым ее результатом будет:
myCar.make = Ford
myCar.model = Mustang
myCar.year = 67
Можно также задавать свойства, используя их порядковые номера, например:
temp[0] = 34
temp[1] =
42
temp[2] = 56
Эти операторы создают свойства объекта temp, и обращаться к ним можно как к элементам массива:
temp[i].3.2. Функции и методы.
Функции в JavaScript - одно из фундаментальных
понятий и конструкций языка.
Функции - это процедуры
JavaScript, состоящие из операторов языка для выполнения определенных задач.
Определение функции состоит из задания ключевого слова function,
имени функции, списка аргументов, заключенных в круглые скобки и разделенных
запятыми и операторами JavaScript, заключенных в фигурные скобки,
{...}.
В Navigator-приложениях можно
определить произвольное число функций, и, как уже отмечалось выше, желательно
задавать определения функций в контейнере заголовка HEAD страницы HTML
документа. Операторы функции могут содержать обращения к другим функциям,
определенным в текущей странице.
Например:
Эта функция получает текстовую строку в качестве
аргумента, добавляет к ней форматирующие коды HTML, используя оператор
конкатенации (+), и результат высвечивает на экране в текущем
документе.
Определение функции не является заданием
на ее выполнение. Например, для обращения к вышеуказанной функции для выполнения
надо задать оператор вызова:
Аргументы функций не ограничиваются заданием только
числовых либо литеральных значений. Можно передавать функциям целые объекты в
качестве параметорв. Приведенное выше описание функции show_props()
являет пример передачи объекта в качестве аргумента.
Аргументы функции передаются в массиве и
внутри функции к ним можно обращаться как к элементам массива arguments с
индексами:
functionName.arguments[i],
где:
functionName - имя
функции,
i - порядковый номер аргумента, начиная с
0.
Таким образом, первым аргументом, переданным функции
myfunc будет myfunc.arguments[0]. Общее число переданных функции
параметров содержит переменная
arguments.length.
Функции могут быть
рекурсивнами, т.е. содержать обращения к себе. Например, как функция
вычисления факториала:
function factorial(n) {
if ((n == 0) || (n ==
1))
return 1
else
{
result = (n * factorial(n-1)
)
return result
}
}
Обращения к функции для вычисления факториала и выдачи на экран можно задать операторами :
for (x = 0; x < 5; x++) {Результат выполнения:
0 factorial is 1
1 factorial is 1
2 factorial is 2
3 factorial is
6
4 factorial is 24
5 factorial is 120
3.2.1.Функции с переменным числом параметров.
Программист может написать обращение к функции с
большим числом параметров, чем формально декларировано в определении функции ( и
если это не противоречит запрограммированному в функции алгоритму). Это бывает
полезным, если не известен заранее объем обрабатываемых данных. Для настройки
программы функции в таких случаях используется переменная
arguments.length.
Например, рассмотрим случай
создания HTML конструкции типа list. В функции определен только один
формальный параметр, прнинимающий значения:
"U" - для выдачи неупорядоченного списка типа
UL,
"O" - для выдачи упорядоченного (нумерованного)
списка типа OL.
Определение функции:
function list(type) {
document.write("<" + type +
"L>") // begin list
for (var i = 1; i <
list.arguments.length; i++) // iterate through
arguments
document.write("<LI>" +
list.arguments[i])
document.write("</" + type +
"L>") // end list
}
К этой функции допустимо обращение с неопределенным числом параметров:
list("o", "one", 1967, "three", "etc, etc...")
Результат выдачи на экран:
1. one
2. 1967
3. three
4. etc, etc
3.3. Определение метода объекта.
Метод объекта - это функция, ассоциированая с
объектом.
Определение метода задается также, как и
определение стандартной функции. Таким образом, используется следующий синтаксис
задания ассоциированной функции к существующему объекту:
object.methodname =
function_name,
где:
object - имя существующего
объекта,
function_name - имя функции.
Затем, можно использовать функцию-метод в контексте парадигмы объектов как:
object.methodname(params);
3.3.1.Метод This в обращении к объекту.
JavaScript имееет специальное ключевое слово "this" для обращения к "текущему" объекту. Например, выполняется вызов функции validate() , которая определяет значимость (допустимость) свойств объектов (в пределах минимального и максимального значений).
Определение функции:
function validate(obj, lowval, hival) {
if ((obj.value
< lowval) || (obj.value > hival))
alert("Invalid Value!")
}
Затем, вызывается функция validate() в обработчике событий для определения допустимости введенных значения в полях ввода элементов конструкции form с заданием текущей form как объекта (из возможно многих form) в данной HTML страницы.
<INPUT TYPE = "text" NAME = "age" SIZE = 3 onChange="validate(this, 18, 99)">
В общем случае метод this относится с вызываемому объекту.
3.4. Создание новых объектов.
В клиент- и сервер-приложениях JavaScript имеется большое число уже определенных объектов. Тем не менее, пользователю предоставляеся возможность создания собственных объектов.
Для этого надо выполнить два шага:
- написать
функцию для определения типа объекта,
- используя
new создать конкретный объект.
В функции определения типа объекта задаются
его имя, свойства и методы.
Например, при создании объекта типа car (машина) нужно задать такие его
свойства как : make, model, year и color. Для этого пишется
функция:
function car(make, model, year) {
this.make =
make;
this.model = model;
this.year
= year;
}
Затем, можно создать несколько конкретных объектов типа car:
mycar = new car("Eagle", "Talon TSi",
1993);
kenscar = new car("Nissan",
"300ZX", 1992)
Объекты могут иметь свойства, которые, в свою очередь, могут быть другими объектами. Это удобнее всего продемонстрировать на следующих примерах:
1.Задаем определение объекта типа person:
function person(name, age, sex) {
this.name =
name;
this.age = age;
this.sex =
sex;
}
2. Создаем два конкретных объекта:
rand = new person("Rand McNally", 33,
"M")
ken = new person("Ken Jones", 39, "M")
3. Перепишем определение объекта car, добавляя новое свойство owner, которое является объектом типа person:
function car(make, model, year, owner) {
this.make =
make;
this.model = model;
this.year
= year;
this.owner = owner;
}
4. Создаем новые объекты:
car1 = new car("Eagle", "Talon TSi", 1993,
rand);
car2 = new car("Nissan", "300ZX", 1992,
ken)
Заметим, что вместо передачи литеральной строки или численного значения при создании нового объекта, в приведенном примере передаются в качестве аргументов объекты rand и ken. И, таким образом , для обращения к имени владельца машины car2 можно использовать следующее свойство:
car2.owner.name
Замечание: всегда можно добавить новое свойство к ранее определенному
объекту. Например, оператор :
car1.color =
"black"
добавляет свойство color к конкретному объекту car1 и
присваивает значение "black". Тем не менее, это не означает
автоматического изменения других объектов типа car.
3.5. Определение методов.
Возможно задание метода для выбранного объекта включая само определение метода в функцию определения этого объекта. Например, имеется система графических изображений объектов в виде GIF файлов и нужно определить метод для высвечивания информации (подпись к картинке) для каждого графического изображения. В этом случае необходимо задать функцию следующим образом:
function displayCar() {
var result = "A Beautiful " +
this.year
+ " " + this.make + " "
+ this.model; pretty_print(result)
}
где:
pretty_print() -
ранее описанная функция для выдачи на экран текстовой строки.
Заметим также, что используется this для обращения к объекту, к которому принадлежит сам метод. Можно также использовать эту функцию для задания дополнительного метода к объекту car, добавив в определение объекта оператор
this.displayCar = displayCar;
Таким образом, полное определение объекта типа car будет выглядеть так:
function car(make, model, year, owner) {
this.make =
make;
this.model = model;
this.year
= year;
this.owner = owner;
this.displayCar = displayCar;
}
И возможно использование этих функций для высвечивания как методов объекта:
car1.displayCar()
car2.displayCar()
Результат выдачи на экран будет выглядеть так:
A Beautiful 1993 Eagle Talon TSi
A Beautiful 1992 Nissan 300ZX