3. Объекты в JavaScript.

     Язык JavaScript основан на упрощенной объектно-ориентированной парадигме. Конструкция объектов состоит из свойств (properties), которые являются переменными языка JavaScript. Свойства в свою очередь могут быть объектами. Функции, ассоциированные с объектами, называют методами объектов. В дополнение к встроенным объектам клиент-навигатора пользователь может сам создавать собственные объекты.

3.1. Объекты и свойства.

     Объектам языка JavaScript соответствуют ассоциированные с ними свойства. Доступ к свойствам объекта осуществляется в простой нотации:

           objectName.propertyName,

где:
     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) {
    var result = "";
    for (var i in obj)
      result += obj_name + "." + i + "=" + obj[i] + "\n";
    return result;
}

     Таким образом, при обращении к функции 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 документа. Операторы функции могут содержать обращения к другим функциям, определенным в текущей странице.
     Например:

      function pretty_print(string) {
         document.write("<HR><P>" + string)
      }

     Эта функция получает текстовую строку в качестве аргумента, добавляет к ней форматирующие коды HTML, используя оператор конкатенации (+), и результат высвечивает на экране в текущем документе.
     Определение функции не является заданием на ее выполнение. Например, для обращения к вышеуказанной функции для выполнения надо задать оператор вызова:


<SCRIPT>
pretty_print("This is some text to display")
</SCRIPT>
>

     Аргументы функций не ограничиваются заданием только числовых либо литеральных значений. Можно передавать функциям целые объекты в качестве параметорв. Приведенное выше описание функции 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++) {
    document.write(x, " factorial is ", factorial(x))
    document.write("<BR>")
}
>

     Результат выполнения:

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


BACK.gifВернуться к оглавлению