Ядро JavaScript 1.5. Руководство по Использованию

Глава 7  Работа с Объектами



JavaScript разработан с использованием простой объектно-ориентированной парадигмы. Объект - это конструкция со свойствами, которые являются переменными JavaScript или другими объектами. Объект также может иметь ассоциированные с ним функции, которые известны как методы объекта. В дополнение к имеющимся в Navigator клиентским и серверным объектам Вы можете определять свои собственные объекты.

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

Имеются следующие разделы:
 



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


Объект в JavaScript имеет ассоциированные с ним свойства. Вы получаете доступ к свойству очень просто:

объектаИмя.свойстваИмя

И имя объекта, и имя свойства чувствительны к регистру. Вы определяете свойство, присваивая ему значение. Например, предположим, имеется объект myCar (начиная отсюда, примем для удобства, что объект уже существует). Вы можете создать свойства make, model и year таким образом:

myCar.make = "Ford";
myCar.model = "Mustang";
myCar.year = 1969;

Массив является упорядоченным набором значений, ассоциированных с именем одной переменной. Свойства и массивы JavaScript очень тесно связаны; фактически они являются разными интерфейсами для одной и той же структуры данных. Так, например, Вы можете получить доступ к свойствам объекта myCar:

myCar["make"] = "Ford"
myCar["model"] = "Mustang"
myCar["year"] = 1967

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

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 = 1967



Создание Новых Объектов


В JavaScript есть несколько предопределенных объектов. Кроме того, Вы можете создать Ваши собственные объекты. В JavaScript 1.2 и позднее Вы можете создать объект, используя инициализатор объекта. Альтернативно, Вы можете сначала создать конструктор функции, а затем - инстанциировать объект (создать экземпляр), используя эту функцию и оператор new.


Использование Инициализаторов Объектов


Помимо создания объектов с использованием конструктора функции, Вы можете создать объекты, используя инициализаторы объектов. Использование инициализаторов иногда называется созданием объектов в литеральной нотации. "Инициализатор Объекта" следует терминологии C++.

Синтаксис объекта, использующего инициализатор, таков:

объектаИмя = {свойство1:значение1, свойство2:значение2,..., свойствоN:значениеN}


где объектаИмя это имя нового объекта, каждое свойствоI является идентификатором (именем, числом или строковым литералом), а каждое значениеI является выражением, значение которого присваивается свойствуI.
объектаИмя и присвоение являются необязательными. Если Вам не нужно ссылаться где-либо на этот объект, то нет необходимости присваивать его переменной.

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


Следующий оператор создает объект и присваивает его переменной x, если, и только если, выражение cond будет true:

if (cond) x = {hi:"there"}

Следующий пример создает myHonda с тремя свойствами. Обратите внимание, что свойство engine также является объектом со своими собственными свойствами.

myHonda = {color:"red",wheels:4,engine:{cylinders:4,size:2.2}}

Вы можете также использовать инициализаторы объектов для создания массивов. См. "Литералы Массива".

JavaScript 1.1 и ранее.
 

Вы не можете использовать инициализаторы объектов. Можно создать объекты только с помощью конструкторов функций или используя функцию, предоставляемую для этих целей каким-нибудь другим объектом. См. Использование Конструктора Функции.


Использование Конструктора Функции


Альтернативно Вы можете создать объект в два этапа:

  1. Определить тип объекта, написав конструктор функции.

  2. Создав экземпляр объекта с помощью оператора new.

Чтобы определить тип объекта, создайте функцию для типа объекта, которая специфицирует его имя , свойства и методы. Например, предположим, Вы хотите создать тип объекта для автомобилей и назвать его car, и чтобы он имел свойства make, model, year и color. Для этого нужно написать такую функцию:

function car(make, model, year) {
   this.make = make;
   this.model = model;
   this.year = year;
}

Обратите внимание на использование this для присвоения значений свойствам объекта на базе значений, передаваемых в эту функцию.

Теперь можно создать объект с названием mycar:

mycar = new car("Eagle", "Talon TSi", 1993);

Этот оператор создает объект mycar и присваивает его свойствам специфицированные значения. Теперь значением свойства mycar.make является строка "Eagle", значением свойства mycar.year - целое число 1993 и так далее.

Можно создать любое количество объектов car с помощью оператора new. Например,


kenscar = new car("Nissan", "300ZX", 1992);
vpgscar = new car("Mazda", "Miata", 1990);

Объект может иметь свойство, которое само является объектом. Например, предположим, Вы определяете объект person:

function person(name, age, sex) {
   this.name = name
   this.age = age
   this.sex = sex
}

и затем инстанциируете два новых объекта person:

rand = new person("Rand McKinnon", 33, "M");
ken = new person("Ken Jones", 39, "M");

Затем Вы можете переписать определение car, чтобы включить свойство owner, принимаемое объектом person:

function car(make, model, year, owner) {
   this.make = make;
   this.model = model;
   this.year = year;
   this.owner = owner
}

Для создания новых экземпляров Вы теперь используете:

car1 = new car("Eagle", "Talon TSi", 1993, rand);
car2 = new car("Nissan", "300ZX", 1992, ken);

Заметьте, что теперь, вместо передачи литеральной строки или целочисленного значения при создании новых объектов, вышеприведенные операторы передают rand и ken как аргументы свойства owner. Теперь, чтобы определить имя владельца машины car2, Вы осуществляете доступ к свойству:

car2.owner.name

Заметьте, что таким образом Вы всегда добавляете свойство к ранее определенному объекту. Например, оператор

car1.color = "black"

добавляет свойство color объекту car1 и присваивает ему значение "black." Однако это не влияет на другие объекты. Чтобы добавить новое свойство ко всем объектам того же типа, Вы должны добавить свойство в определение типа объекта car.


Индексирование Свойств Объекта


В JavaScript 1.0 Вы можете ссылаться на свойства объектов по имени свойства или по порядковому индексу. В JavaScript 1.1 и позднее, однако, если Вы первоначально определили свойство по имени, Вы всегда обязаны будете обращаться к нему по имени, и, если Вы первоначально определили свойство по индексу, Вы всегда обязаны будете обращаться к нему по его индексу.

Это применимо при создании объекта и его свойств с помощью конструктора функции, как в примере с типом объекта Car, и если Вы определяете отдельные свойства явным образом (например, myCar.color = "red"). Так, если Вы определили свойства объекта по индексу, как, например, myCar[5] = "25 mpg", Вы можете затем обращаться к этому свойству только как myCar[5].

Исключением из этого правила являются объекты, отраженные из HTML, такие как массивы форм. Вы всегда обращаетесь к этим объектам по порядковому номеру (зависящим от местонахождения объекта в документе) или по их именам (если они определены). Например, если второй тэг <FORM> в документе имеет в атрибуте NAME значение "myForm", Вы можете ссылаться на форму document.forms[1], или document.forms["myForm"] или document.myForm.


Определение Свойств для Типа Объекта


Вы можете добавлять свойство к ранее определенному типу объекта через использование свойства prototype. Так определяется свойство, которое совместно используется всеми объектами специфицированного типа, а не только одним данным экземпляром этого объекта. Следующий код добавляет свойство color ко всем объекта типа car, а затем присваивает значение свойству color объекта car1.

Car.prototype.color=null;
car1.color="black";

См. дополнительную информацию о свойстве prototype объекта Function в книге Ядро JavaScript. Справочник.


Определение Методов


Метод это функция, ассоциированная с объектом. Метод определяется так же, как стандартная функция. Затем используется следующий синтаксис для ассоциирования функции с уже существующим объектом:

object.methodname = function_name

где object это существующий объект, methodname это имя определяемого Вами метода, а function_name имя функции.

Вы затем вызываете метод в контексте объекта:

object.methodname(params);

Вы можете также определить методы для типа объекта, включив определение метода в конструктор функции. Можно определить функцию, которая форматирует и отображает свойства ранее определенных car-объектов; например,


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;
}

Теперь Вы можете вызвать метод displayCar в каждом экземпляре:

car1.displayCar()
car2.displayCar()

Это даст результат, показанный на рисунке.

Рисунок 7.1  Отображение вывода метода



Использование Слова this для Ссылок на Объект


JavaScript имеет специальное ключевое слово this, которое может использоваться внутри метода для ссылки на текущий объект. Например, если у Вас имеется функция validate, проверяющая значение свойства объекта и значения high и low:

function validate(obj, lowval, hival) {
   if ((obj.value < lowval) || (obj.value > hival))
      alert("Invalid Value!")
}

то Вы можете вызвать validate в обработчике события onChange любого элемента формы, используя this для передачи обработчику элемента формы, как в этом примере:

<INPUT TYPE="text" NAME="age" SIZE=3
   onChange="validate(this, 18, 99)">

В общем, this ссылается в методе на вызывающий объект.

В сочетании со свойством формы, this может обращаться к родительской форме текущего объекта. В следующем примере форма myForm содержит Text-объект и кнопку. Если пользователь щелкает на кнопке, значением Text-объекта становится имя формы. Обработчик нажатия кнопки onClick использует this.form для ссылки на родительскую форму, myForm.


<FORM NAME="myForm">
Form name:<INPUT TYPE="text" NAME="text1" VALUE="Beluga">
<P>
<INPUT NAME="button1" TYPE="button" VALUE="Show Form Name"
   onClick="this.form.text1.value=this.form.name">
</FORM>


Определение Getter'ов и Setter'ов


Getter это метод, получающий значение отдельного свойства. Setter это метод, устанавливающий значение отдельного свойства. Вы можете определить getter и setter в любом предопределенном объекте ядра или в пользовательском объекте, поддерживающем добавление новых свойств. Синтаксис определения getter и setter использует синтаксис литерала объекта.

Следующая сессия JS-оболочки иллюстрирует, как getter и setter могут работать для определенного пользователем объекта o. JS-оболочка является приложением, позволяющим разработчикам тестировать код JavaScript в пакетном режиме или интерактивно.

Свойствами объекта о являются:
 

  • o.a - число

  • o.b - getter, возвращающий o.a плюс 1

  • o.c - setter, устанавливающий значение o.a в половину его величины

    js> o = new Object;
    [object Object]
    js> o = {a:7, get b() {return this.a+1; }, set c(x) {this.a = x/2}};
    [object Object]
    js> o.a
    7
    js> o.b
    8
    js> o.c = 50
    js> o.a
    25
    js>

Эта сессия JavaScript иллюстрирует то, как getter и setter могут расширять прототип Date, добавляя свойство year ко всем экземплярам предопределенного класса Date. Она использует существующие методы getFullYear и setFullYear класса Date для поддержки getter и setter свойства year.

Эти операторы определяют getter и setter для свойства year:

js> var d = Date.prototype;
js> d.year getter= function() { return this.getFullYear(); };

js> d.year setter= function(y) { return this.setFullYear(y); };

Следующие операторы используют getter и setter в Date-объекте:

js> var now = new Date;
js> print(now.year);
2000
js> now.year=2001;
987617605170
js> print(now);
Wed Apr 18 11:13:25 GMT-0700 (Pacific Daylight Time) 2001



Удаление Свойств


Вы можете удалить свойство оператором delete. Этот код показывает, как удалить свойство.

//Создается новое свойство myobj с двумя свойствами a и b.
myobj = new Object;
myobj.a=5;
myobj.b=12;

//Удаляется свойство a, и в myobj остается только свойство b.
delete myobj.a;

Можно также использовать delete для удаления глобальной переменной, если ключевое слово var не было использовано при объявлении этой переменной:

g = 17;
delete g;


См. "delete".



Предопределенные Объекты Ядра

В этом разделе рассмотрены предопределенные объекты ядра JavaScript: Array, Boolean, Date, Function, Math, Number, RegExp и String.


Объект Array


В JavaScript нет отдельного типа для массива данных. Однако Вы можете использовать предопределенный объект Array и его методы для работы с массивами в Ваших приложениях. Объект Array имеет методы для манипулирования массивами: объединения, разворачивания и сортировки. Он имеет также свойство для определения размера массива и другие свойства для использования с регулярными выражениями.

Массив это упорядоченный набор значений, к которым можно обращаться по имени и по индексу. Например, Вы имеете массив emp, содержащий имена служащих, индексированный по именам служащих. Так, emp[1] это служащий номер 1, emp[2] - служащий номер 2 и так далее.

Создание Массива

Чтобы создать Array-объект:

1. arrayObjectName = new Array(element0, element1, ..., elementN)
2. arrayObjectName = new Array(arrayLength)

arrayObjectName это имя нового объекта, либо свойство существующего объекта. При использовании Array-свойств и методов, arrayObjectName это либо имя существующего Array-объекта, либо свойство существующего объекта.

element0, element1, ..., elementN это список значений элементов массива. Когда специфицирована эта форма, массив инициализируется специфицированными значениями в качестве элементов массива, а свойство length массива устанавливается в количество аргументов.

arrayLength это начальный размер массива. Следующий код создает массив из 5 элементов:

billingMethod = new Array(5)

Литералы массива также являются Array-объектами; например, нижеследующий литерал является Array-объектом. См. "Литералы Массива".

coffees = ["French Roast", "Columbian", "Kona"]

 

Наполнение Массива
 

Вы можете заполнить массив путем присвоения значений его элементам. Например,

emp[1] = "Casey Jones"
emp[2] = "Phil Lesh"
emp[3] = "August West"


Вы можете также заполнить массив при его создании:


myArray = new Array("Hello", myVar, 3.14159)

 

Обращение к Элементам Массива

Вы можете обратиться к элементам массива через использование порядкового номера элемента. Например, Вы определили массив:

myArray = new Array("Wind","Rain","Fire")

Затем Вы обращаетесь к первому элементу массива myArray[0], а ко второму элементу - myArray[1].

Индексы элементов начинаются с нуля (0), но размер массива (например, myArray.length) отражает точное количество элементов в массиве.

Array-Методы

Array-объект имеет следующие методы:
 

  • concat объединяет два массива и возвращает новый массив;

  • join объединяет все элементы массива в строку;

  • pop удаляет последний элемент массива и возвращает этот элемент;

  • push добавляет один или более элементов в конец массива и возвращает эти последние добавленные элементы;

  • reverse разворачивает элементы массива: первый элемент становится последним, а последний - первым;

  • shift удаляет первый элемент массива и и возвращает этот элемент;

  • slice извлекает часть массива и возвращает новый массив;

  • splice добавляет и/или удаляет элементы из массива;

  • sort сортирует элементы массива;

  • unshift добавляет один или более элементов в начало массива и возвращает новый размер массива.

Например, Вы определили следующий массив:

myArray = new Array("Wind","Rain","Fire")


myArray.join() возвращает "Wind,Rain,Fire";
myArray.reverse переворачивает массив так, что myArray[0] будет "Fire", myArray[1] - "Rain", а myArray[2] - "Wind".
myArray.sort сортирует массив так, что myArray[0] будет "Fire", myArray[1] - "Rain", в myArray[2] - "Wind".

Двухмерные Массивы

Следующий код создает двухмерный массив:

a = new Array(4)
for (i=0; i < 4; i++) {
   a[i] = new Array(4)
   for (j=0; j < 4; j++) {
      a[i][j] = "["+i+","+j+"]"
   }
}

Создается массив, состоящий из следующих рядов/rows:

Row 0:[0,0][0,1][0,2][0,3]
Row 1:[1,0][1,1][1,2][1,3]
Row 2:[2,0][2,1][2,2][2,3]
Row 3:[3,0][3,1][3,2][3,3]

Массивы и Регулярные Выражения

Ели массив является результатом совпадения регулярного выражения и строки, этот массив возвращает свойства и элементы, предоставляющие информацию о совпадении. Массив является return-значением методов RegExp.exec, String.match и String.split. Об использовании массивов с регулярными выражениями см. Главу 4, "Регулярные Выражения".


Объект Boolean


Объект Boolean является оболочкой вокруг примитивного типа данных Boolean. Для создания Boolean-объекта используйте следующий синтаксис:

booleanObjectName = new Boolean(value)

Не путайте примитивные Boolean-значения true и false со значениями true и false Boolean-объекта. Любой объект, значение которого не undefined , null, 0, NaN или не пустая строка, включая Boolean-объект со значением false, вычисляется в true при передаче условному оператору. См. "Оператор if...else".



Объект Date


В JavaScript нет типа данных data. Однако Вы можете использовать для работы с датами и временем объект Date и его методы. Объект Date имеет большое количество методов для установки, получения и манипулирования датами. Он не имеет никаких свойств.

JavaScript обрабатывает даты аналогично Java. Эти два языка имеют много аналогичных date-методов и оба хранят даты как количество миллисекунд, прошедших после 1 января 1970 года, 00:00:00.

Объект Date имеет диапазон значений от -100,000,000 до 100,000,000 дней в обе стороны от 01 января 1970 года UTC (Всемирного Времени).

Для создания Date-объекта:

dateObjectName = new Date([parameters])

где dateObjectName это имя создаваемого Date-объекта; это может быть новый объект или свойство существующего объекта.

Параметры/parameters в этом синтаксисе могут быть:

  • пустыми: вводятся текущие время и дата. Например, today = new Date();

  • строкой, представляющей дату в следующем формате: "месяц  день, год  час:минуты:секунды." Например, Xmas95 = new Date("December 25, 1995 13:30:00"). Если Вы пропустите часы, минуты или секунды, значение будет установлено в нуль.

  • набором целочисленных значений для года, месяца и дня. Например, Xmas95 = new Date(1995,11,25). Набором значений для года, месяца, дня, часов, минут и секунд. Например, Xmas95 = new Date(1995,11,25,9,30,0).

JavaScript 1.2 и ранее.

Объект Date ведет себя так:

  • Даты до 1970 не допускаются.

  • JavaScript зависит от специфики поведения даты на конкретной платформе; поведение Date-объекта варьируется от платформы к платформе.


Методы Объекта Date

Методы объекта Date для работы с датами и временем подразделяются на следующие категории:

  • "set" методы для установки значений даты времени в Date-объектах;

  • "get"  методы для получения значений даты времени из Date-объектов;

  • "to" методы для возвращения строковых значений из Date-объектов;

  • методы parse и UTC для разбора Date-строк.

С помощью методов "get" и "set" Вы можете по отдельности получать и устанавливать значения секунд, минут, часа, дня месяца, дня недели, месяца и года. Имеется метод getDay, возвращающий день недели, но отсутствует парный метод setDay, поскольку день недели устанавливается автоматически. Эти методы используют целые числа для представления своих значений:

  • Секунд и минут: от 0 до 59

  • Часа: от 0 до 23

  • Дня недели: от 0 (воскресенье) до 6 (суббота)

  • Даты: от 1 до 31 (день месяца)

  • Месяца: от 0 (январь) до 11 (декабрь)

  • Года: годы после 1900

Например, Вы определили следующую дату:

Xmas95 = new Date("December 25, 1995")

Тогда Xmas95.getMonth() возвратит 11, а Xmas95.getFullYear() возвратит 1995.


Методы getTime и setTime используются при сравнении дат. Метод getTime возвращает количество миллисекунд, прошедших после 1 января 1970 года, 00:00:00, для Date-объекта.

Например, следующий код выводит количество дней, оставшихся до конца текущего года:

today = new Date()
endYear = new Date(1995,11,31,23,59,59,999) // Устанавливает день и месяц
endYear.setFullYear(today.getFullYear()) // Устанавливает год в текущее значение
msPerDay = 24 * 60 * 60 * 1000 // Количество миллисекунд в день
daysLeft = (endYear.getTime() - today.getTime()) / msPerDay
daysLeft = Math.round(daysLeft) //возвращает количество оставшихся в этом году дней


Этот пример создает Date-объект по имени today, содержащий текущую дату. Затем создается Date-объект endYear и в него устанавливается текущее значение года. Затем, путем использования количества миллисекунд в день, вычисляется количество дней от сегодняшнего числа до до endYear через использование метода getTime и оно округляется до целого количества дней.

Метод parse применяется для присвоения значений date-строк существующим Date-объектам. Например, следующий код использует методы parse и setTime для присвоения значения даты объекту IPOdate:

IPOdate = new Date()
IPOdate.setTime(Date.parse("Aug 9, 1995"))

 

Использование Объекта Date: Пример

В этом примере функция JSClock() возвращает время в формате электронного циферблата:

function JSClock() {
   var time = new Date()
   var hour = time.getHours()
   var minute = time.getMinutes()
   var second = time.getSeconds()
   var temp = "" + ((hour > 12) ? hour - 12 : hour)
   if (hour == 0)
      temp = "12";
   temp += ((minute < 10) ? ":0" : ":") + minute
   temp += ((second < 10) ? ":0" : ":") + second
   temp += (hour >= 12) ? " P.M." : " A.M."
   return temp
}

Функция JSClock сначала создает новый Date-объект time; поскольку аргументы не заданы, time создается с текущими датой и временем. Затем вызываются методы getHours, getMinutes и getSeconds, присваивающие текущие значения часа, минут и секунд переменным hour, minute и second.

Следующие 4 оператора строят строковое значение на базе time. Первый оператор создает переменную temp, присваивая ее значение путем использования условного выражения; если hour больше 12, (hour - 12), иначе просто hour, если только hour не 0, тогда он становится 12.

Следующий оператор присоединяет значение minute к temp. Если значение minute меньше 10, условное выражение прибавляет строку с предшествующим нулем; иначе добавляется строка с разделяющим двоеточием. Затем оператор присоединяет второе значение к temp тем же способом.

Наконец, условное выражение присоединяет "PM" к temp, если hour равен 12 или больше; иначе присоединяется "AM".


Объект Function


Предопределенный объект Function специфицирует строку кода JavaScript, которая компилируется как функция.

Создание Function-объекта:

functionObjectName = new Function ([arg1, arg2, ... argn], functionBody)

functionObjectName это имя переменной или свойства существующего объекта. Это также может быть объект с последующим именем обработчика события, в нижнем регистре, таким как window.onerror.

arg1, arg2, ... argn это аргументы, используемые функцией в качестве имен формальных аргументов. Каждый обязан быть строкой, соответствующей верному идентификатору JavaScript; например, "x" или "theForm".

functionBody это строка, специфицирующая код JavaScript, компилируемый как тело функции.


Function-объекты вычисляются всякий раз при их использовании. Это менее эффективно, чем объявление функции и вызов ее в коде, поскольку объявленные функции компилируются.

Дополнительно Вы можете также использовать оператор function и выражение function. См. книгу Ядро JavaScript. Справочник.

Следующий код присваивает функцию переменной setBGColor. Эта функция устанавливает цвет фона документа.

var setBGColor = new Function("document.bgColor='antiquewhite'")

Чтобы вызвать Function-объект, Вы можете специфицировать имя переменной так, будто это функция. Следующий код выполняет функцию, специфицированную переменной setBGColor:


var colorChoice="antiquewhite"
if (colorChoice=="antiquewhite") {setBGColor()}

Вы можете назначить функцию обработчику события одним из следующих способов:


1. document.form1.colorButton.onclick=setBGColor
2. <INPUT NAME="colorButton" TYPE="button"
      VALUE="Change background color"
      onClick="setBGColor()">

Создание переменной setBGColor, показанное выше, аналогично объявлению следующей функции:


function setBGColor() {
   document.bgColor='antiquewhite'
}

Присвоение функции переменной похоже на объявление функции, но есть и отличия:

  • Если Вы присваиваете функцию переменной, используя var setBGColor = new Function("..."), setBGColor является переменной, для которой текущим значением является ссылка на функцию, созданную оператором new Function().

  • Если Вы создаете функцию, используя function setBGColor() {...}, setBGColor не является переменной. Это имя функции.

Вы можете вложить одну функцию в другую. Вложенная (внутренняя) функция является private для своего контейнера (внешней функции):

  • Доступ ко внутренней функции имеется только из операторов во внешней функции.

  • Внутренняя функция может использовать аргументы и переменные внешней функции. Внешняя функция не может использовать аргументы и переменные внутренней функции.


Объект Math


Предопределенный объект Math имеет свойства и объекты для работы с математическими константами и функциями. Например, свойство PI объекта Math имеет значение pi (3.141...), которое Вы можете использовать в приложении таким образом:

Math.PI

Аналогично и стандартные математические функции являются методами объекта Math. Сюда входят тригонометрические, логарифмические, экспоненциальные и другие функции. Например, Если Вы хотите использовать тригонометрическую функцию sine/синус, Вы можете записать:

Math.sin(1.56)

Заметьте, что все тригонометрические методы объекта Math принимают аргументы в радианах.


В таблице содержится резюме по методам объекта Math.

Таблица 7.1   Методы Объекта Math

Метод
Описание
abs

Абсолютное значение.

sin, cos, tan

Стандартные тригонометрические функции; аргумент в радианах.

acos, asin, atan, atan2

Инверсные тригонометрические функции; возвращают значения в радианах.

exp, log

Экспоненциальный и натуральный логарифмы, база e.

ceil

Возвращает ближайшее целое число, больше или равное аргументу.

floor

Возвращает наибольшее целое число, меньше или равное аргументу.

min, max

Возвращает больший или меньший (соответственно) из двух аргументов.

pow

Степень; первый аргумент это база, второй показатель степени.

random

Возвращает случайное число в диапазоне от 0 до 1.

round

Округляет аргумент до ближайшего целого.

sqrt

Квадратный корень.

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


Объект Number


Объект Number содержит свойства для работы с числовыми константами, такими как максимальное значение, not-a-number и infinity/бесконечность. Вы не можете изменить значения этих свойств и будете использовать их таким образом:

biggestNum = Number.MAX_VALUE
smallestNum = Number.MIN_VALUE
infiniteNum = Number.POSITIVE_INFINITY
negInfiniteNum = Number.NEGATIVE_INFINITY
notANum = Number.NaN

Вы всегда обращаетесь к свойствам предопределенного объекта Number так, как показано выше, а не как к свойствам Number-объекта, созданного Вами.

В таблице дано резюме по свойствам объекта Number.

Таблица 7.2   Свойства Объекта Number

Свойство
Описание
MAX_VALUE

Наибольшее представимое число.

MIN_VALUE

Наименьшее представимое число.

NaN

Специальное значение "not a number/не число".

NEGATIVE_INFINITY

Специальное значение отрицательной  бесконечность; возвращается при переполнении.

POSITIVE_INFINITY

Специальное значение положительной бесконечности; возвращается при переполнении.

Прототип Number предоставляет методы для запроса информации от Number-объектов в разных форматах. В следующей таблице дано резюме по методам Number.prototype.


Таблица 7.3   Методы Number.prototype

Метод
Описание
toExponential

Возвращает строку - число в экспоненциальной нотации.

toFixed

Возвращает строку - число в нотации с плавающей точкой.

toPrecision

Возвращает строку - число специфицированной точности в нотации с плавающей точкой.

toSource

Возвращает литерал объекта - специфицированный Number-объект; Вы можете использовать это значение для создания нового объекта. Переопределяет метод Object.toSource.

toString

Возвращает строку - специфицированный объект. Переопределяет метод Object.toString.

valueOf

Возвращает примитивное значение специфицированного объекта. Переопределяет метод Object.valueOf.


Объект RegExp


Объект RegExp позволяет работать с регулярными выражениями. описан в Главе 4, "Регулярные Выражения."


Объект String


Объект String является оболочкой вокруг примитивного типа данных string. Не путайте строковой литерал с объектом String. Например, следующий код создает строковой литерал s1 и String-объект s2:

s1 = "foo" //создается строковое литеральное значение
s2 = new String("foo") //создается String-объект

Вы можете вызвать любой из методов объекта String в строковом литеральном значении - JavaScript автоматически конвертирует строковой литерал во временный String-объект, вызывает метод, затем уничтожает временный String-объект. Вы можете также использовать со строковым литералом свойство String.length.

Вы, как правило, должны использовать строковые литералы, если только Вам не нужно использовать именно String-объект, так как String-объекты могут иметь непредсказуемое поведение. Например:

s1 = "2 + 2" //строковое литеральное значение
s2 = new String("2 + 2")//String-объект
eval(s1) //возвращает число 4
eval(s2) //возвращает строку "2 + 2"

Объект String имеет только одно свойство, length, которое обозначает количество символов в строке. Например, следующий код присваивает переменной x значение 13, так как строка "Hello, World!" содержит 13 символов:

myString = "Hello, World!"
x = mystring.length

Объект String имеет методы двух типов: возвращающие варианты самой строки, такие методы как substring и toUpperCase, и методы, которые возвращают HTML-форматированную версию строки, такие методы как bold и link.

Например, используя предыдущий пример, и mystring.toUpperCase(), и "hello, world!".toUpperCase() возвращают строку "HELLO, WORLD!"

Метод substring принимает два аргумента и возвращает подстроку между двумя аргументами. Используя предыдущий пример, mystring.substring(4, 9) возвращает строку "o, Wo". См. метод substring объекта String в книге Ядро JavaScript. Справочник.

Объект String имеет также несколько методов для автоматического HTML-форматирования, такие как bold - для создания текста с "жирным" шрифтом и link - для создания гиперссылки. Например, Вы можете создать гиперссылку на гипотетический URL методом link:

mystring.link("http://www.helloworld.com")

В таблице дано резюме по методам String-экземпляров.

Таблица 7.4   Методы Экземпляров Объекта String


Метод
Описание
anchor

Создает именованный "якорь" HTML.

big, blink, bold,
fixed, italics, small,
strike, sub, sup

Форматируют строку HTML.

charAt, charCodeAt

Возвращают символ или код символа в специфицированной позиции в строке.

indexOf, lastIndexOf

Возвращают позицию специфицированной подстроки в строке или последнюю позицию специфицированной подстроки, соответственно.

link

Создает гиперссылку HTML.

concat

Объединяет текст двух строк и возвращает новую строку.

fromCharCode

Конструирует строку из специфицированной последовательности значений Unicode. Это метод класса String, а не String-экземпляра.

split

Делит String-объект на массив строк, разделяя строку на подстроки.

slice

Извлекает часть строки и возвращает новую строку.

substring, substr

Возвращает специфицированный поднабор строки, специфицируя либо начальный и конечный индексы, либо начальный индекс и размер.

match, replace, search

Работа с регулярными выражениями.

toLowerCase, toUpperCase

Возвращает все символы в строке в нижнем или верхнем регистре, соответственно.

Назад     Оглавление     Индекс     Вперед

 

Наши ссылки на веб-страницы, можно скопировать html-код ссылки


Книги по математике и физике, программы HTML, компьютерные технологии

Документация HTML, XML, JavaScript на русском языке для разработчиков W3C

   Примечание. Удобная текстовая ссылка для форумов, блогов, цитирования материалов веб-сайта, код html можно скопировать и просто вставить в Ваши веб-страницы при цитировании материалов нашего веб-сайта. Материал носит неофициальный характер и приведен для ознакомления.