Слайд 1Объект Array
Свойства: length – число элементов в массиве. Оно
доступно как для чтения, так и для записи, то есть
с помощью этого свойства можно менять размерность массива (можно увеличить длину массива, уменьшить ее или удалить из него все элементы).
Слайд 2
Методы : join (), revers (), sort (), push(),
unshift(), pop (), shift()
Метод: join ()
Синтаксис: массив.join ()
или
массив.join (разделитель)
Если разделителя нет, то используется пустая строка.
Слайд 3
Преобразует каждый элемент массива в строку, а затем конкатенирует
эти строки, вставляя между элементами заданную строку разделителя.
Возвращает полученную
в итоге строку.
Вызов метода не меняет исходный массив.
Слайд 4
Метод: reverse ()
Синтаксис: arrayObj.reverse ()
Возвращает: Измененный порядок следования элементов
массива на обратный.
Внимание!
Этот метод меняет исходный массив.
Слайд 5
Методы: push(), unshift()
Синтаксис:
arrayObj.push (Значение_или_объект)
arrayObj.unshift (Значение_или_объект)
Добавить элемент (элементы)
в массив:
push – в конец массива;
unshift – в начало массива.
Если добавляемый элемент – другой массив, то он в добавленном будет одним элементом.
Слайд 6
Например:
var Arr1 = new Array (1,2,3,4,5);
var Arr_r =
new Array (“one”,”two”,”three”);
Arr1.push(Arr_r);
alert (Arr1.length) => выдаст значение, равное шести.
То есть
массив Arr1 будет иметь вид:
1,2,3,4,5,’ “one”,”two”,”three”’
Слайд 7
Методы: pop (), shift()
Синтаксис:
arrayObj.pop (), arrayObj.shift()
Извлекает элемент из массива
с удалением:
pop - в конце массива;
shift - в начале массива.
Возвращает удаляемый
элемент.
Слайд 8
Методы concat (), slice () и splice ()
Данные методы
позволяют манипулировать частями массива.
1) Метод concat () объединяет два массива
в один.
Синтаксис:
Arr = array1. concat (array2)
Слайд 9
Пример:
var a1 = new Array (1,2,3,4,5);
var a2 = new
Array (“a”,”b”,”c”);
var ar = a1. concat (a2);
В результате получим
следующее:
1,2,3,4,5, “a”,”b”,”c”
Слайд 10
2) Метод slice () возвращает часть массива в
виде отдельного объекта Array
Синтаксис:
array_obj.slice (offset [,end_index])
Первый аргумент данного метода
указывает индекс смещения первого элемента, который нужно поместить в новый массив.
Примечание: Индекс массива начинается с нуля.
Слайд 11
Пример 1:
var Arr1 = new Array (0,1,2,3,4,5,6,7,8);
var Arr2
= Arr1.slice(3);
Получаем массив Arr2, состоящий из элементов (3,4,5,6,7,8).
Примечание:
Исходный массив
не меняется.
Слайд 12
Второй аргумент (необязательный) – это конечный индекс выделяемого фрагмента
массива, то есть индекс первого элемента, который уже не надо
включать в этот фрагмент.
Пример 2:
var Arr1 = new Array (0,1,2,3,4,5,6,7,8);
var Arr2 = Arr1.slice(3,5);
Получаем массив Arr2, состоящий из элементов (3,4).
Слайд 13
3) Метод splice () – изменяет массив-аргумент, а
также возвращает новый массив, содержащий элементы, удаленные из первого.
Синтаксис:
arr
= array_obj.splice
(begin_index, quantity[,new_array]);
Первый аргумент – начальный индекс (как для метода slice()).
Слайд 14
Второй аргумент – это количество элементов, которое нужно
удалить (в отличие от slice(), у которого второй аргумент –
это конечный индекс).
Пример 1:
var Arr1 = new Array (0,1,2,3,4,5,6,7,8);
var Arr2 = Arr1.splice(3,2);
Получаем массив Arr2, состоящий из элементов (3,4),
а массив Arr1 – из (0,1,2,5,6,7,8).
Слайд 15
Данный метод позволяет помещать на место удаляемых элементов массива
новые элементы. Все аргументы после второго будут вставлены в массив
в точке удаления.
Третий аргумент (необязательный) – список элементов, которые будут вставлены в массив вместо удаленных. Причем, количество вставляемых элементов не обязательно должно быть равно количеству удаленных.
Слайд 16
Пример 2:
var Arr1 = new Array (0,1,2,3,4,5,6,7,8);
var Arr2 =
Arr1.splice(3,2,”a”,”b”,”c”);
Получаем массив Arr2, состоящий из элементов (3,4),
а
массив Arr1 – из (0,1,2,a,b,c,5,6,7,8).
Слайд 17
Метод: sort ()
Синтаксис:
arrayObj.sort ()
arrayObj.sort (funct)
funct -
необязательная функция сравнения.
Возвращает: При отсутствии аргумента funct выполняет сортировку
исходного массива в лексикографическом порядке ( по кодам символов).
Слайд 18
При необходимости элементы в начале
преобразуются в строки, чтобы их
можно
было сравнивать.
Для сортировки элементов массива в ином порядке необходимо
задать функцию,
которая сравнивает два значения и выдает число, обозначающее их относительный порядок.
Слайд 19
При задании функции сравнения func необходимо указать два аргумента
А и Б.
Функция func должна возвращать:
- значение меньше
нуля, если значение аргумента А меньше Б или следует перед Б;
- ноль, если А и Б эквивалентны;
- значение больше нуля, если А больше Б или следует после Б.
Слайд 20
Пример:
function by_down (A,B)
{return (B - A)}
function by_up (A, B)
{return
(A - B)}
var arr1 = new Array (1,
2, 4, 8, 16, 32, 64);
var arr 2 = new Array( );
var arr 3 = new Array( );
var arr 4 = new Array( );
Слайд 21
arr 2 = arr1.sort( );
arr 3 = arr2.sort (by_down);
arr
4 = arr2.sort(by_up);
alert (arr2); // по алфавиту
1, 16, 32, 4,
64, 8
alert (arr 3); // по убыванию
64, 32, 16, 8, 4, 2, 1
alert (arr 4); //по возврастанию
1, 2, 4, 8, 16, 32, 64
Слайд 22
Объект Object
Данный объект определяет все объекты JavaScript. Все остальные
типы объектов, встроенные объекты и определенные в JavaScript объекты наследуют
поведение этого типа.
Основная характеристика этого объекта – способность содержать элементы, то есть другие объекты.
Так как в JavaScript нет определений классов как таковых, то объект может получать новые элементы в любой момент его деятельности.
Слайд 23
В JavaScript можно использовать вместо обычной записи объектов
и свойств (через точку)
форму записи с квадратными скобками, которая
в других языках обычно используется для записи массивов:
myObject.something = “Hello, World!”;
myObject[“something”] = “Hello, World!”;
Эти два оператора совершенно эквивалентны.
Слайд 24
Причем, если этого свойства в объекте раньше не было,
то оно будет создано и добавлено в объект.
Добавление новых свойств
в объект JavaScript расширяет набор данных, хранимых в нем.
Добавление новых методов в объект расширяет его поведение.
Можно наполнять новыми возможностями отдельно взятые объекты, так и можно расширять определение всего типа объекта.
Слайд 25
Создание объектов JavaScript, определяемых пользователем
Помимо встроенных объектов, язык JavaScript
позволяет реализовать объекты, определяемые пользователем.
1. Применение конструктора Object
Вначале объявляем
объект:
var picture = new Object ();
Слайд 26
Потом в него добавляем свойства:
picture.id = 2;
picture.title
= “Весна”;
picture.date = new Date(“2009/03/08”);
При этом не обязательно ограничиваться простыми
свойствами.
Слайд 27
Любое свойство объекта может быть сложным объектом, например:
picture.details =
new Object ();
picture.details.type = “Фотография”;
picture.details.description = new Array (“Дата”,”Место”,”Кто”);
Слайд 28Доступ к свойствам объектов осуществляется с помощью следующей записи:
objectName.propertyName
где
objectName - имя объекта в JS;
propertyName - имя свойства,
которое необходимо вызвать.
Слайд 29
Можно прикрепить к объекту метод, например:
picture.getAge = function ()
{return new Date() – this.date;}
Здесь в фигурных скобках вычисляется разность
дат между текущей и заданной.
Вызов данного метода может быть таким:
picture.getAge()/(1000*60*60*24*365);
Слайд 30
2. Объявление объекта с помощью JSON
В JavaScript есть ещё
одна форма записи для создания объектов, использующая ассоциативную природу этих
объектов.
Формат, использующийся для этого, называется JSON (JavaScript Object Notation – нотация записи объектов JavaScript).
Слайд 31
Пример:
var picture =
{ id: 2,
title: “Весна”,
date: new
Date(2009,03,8),
details:
{ type: “Фотография”,
description: [“Дата”,”Место”,”Кто”]
},
getAge:
function() {return new Date()
– this.date;}
}
Слайд 32
Рассмотрим, как устроен формат JSON и как он работает.
У этого есть два правила.
Первое правило.
Объекты представляются в виде
наборов пар “ключ-значение”, причем пары разделяются запятыми, а ключ и значение в парах – двоеточием.
Само определение объекта помещается в фигурные скобки.
Слайд 33
Второе правило.
Массивы представляются в виде списков элементов, разделенных запятыми.
Эти списки помещаются в квадратные скобки.
Объекты и массивы могут быть
вложенными, причем глубина вложения не ограничена.
JSON – это базовая возможность языка JavaScript. Для её использования не требуется никаких дополнительных библиотек или вспомогательного кода.
Слайд 34
JSON в настоящее время широко используется в библиотеках JavaScript:
Prototype, jQuery и др.
JSON легко применять, но она позволяет
создавать только отдельные экземпляры объектов.
Для многократного применения при создании экземпляров объектов рассмотрим следующее:
Слайд 353. Определение типов объектов с помощью прототипов
Данный способ применяется, если
необходимо определить тип объекта со стандартными свойствами, а затем создавать
экземпляры этого типа.
Слайд 36
А: Создание функции-конструктора (структуры объекта)
function Picture (arg_id, arg_title, arg_date, arg_details)
{
this.id =
arg_id;
this.title = arg_title;
this.date = arg_date;
this. Details = arg_details;
}
..................
Слайд 37Оператор this используется в языке JavaScript для ссылки на данный
объект.
В контексте функции Picture () значение this относится к
данной функции, следовательно, this.id на самом деле является сокращенной записью Picture.id.
Функция Picture() в данном случае просто задает структуру объекта Picture и присваивает значение его свойствам: id, title, date и Details.
Слайд 38 В: Инициализация объекта
Производится путем вызова конструктора:
var picture
= new Picture (3, “Весна”,new Date (”2009/03/08”),
{
type: “Фотография”,
description: [“Дата”,”Место”,”Кто”];
}
)
Слайд 39
Для ссылки на значения, хранящиеся в объекте, то есть
на свойства объекта, можно использовать выражение
picture.title
которое в данном
случае выдает значение "Весна".
Слайд 40 Объекты могут использовать свойства, которые сами являются другими объектами.
Например, пусть есть простой объект person, определяемый следующим образом:
function person (name_arg)
{
this.name = name_arg;
}
Слайд 41
то можно создать новые объекты person с именами
p1 и p2 с помощью операторов:
p1 = new person
("Петров В.Г.");
p2 = new person ("Иванов И.П.");
Доступ к значению свойства этих объектов идет обычным образом:
alert (p1. name);
alert (p2. name);
Слайд 42
Рассматривая этот пример,
предположим, что есть некий новый объект с
названием emailAddr,
в котором каждому объекту person ставится в соответствие
определенный адрес электронной почты.
Слайд 43Этот объект определяется следующим образом:
function emailAddr (name_arg,
addr_arg)
{
this.e_name = name_arg;
this.e_address = addr_arg;
}
Тогда можно создать два новых объекта emailAddr следующим образом:
Слайд 44
e1 = new emailAddr (p1, "petrov@pmi.donetsk.ua");
e2 = new emailAddr (p2, "ivanov@pmi.donetsk.ua");
Чтобы получить адрес электронной
почты человека с фамилией Петров, надо воспользоваться записью e1.e_name.name.
Слайд 45Добавление новых свойств объектов
При помощи операции присваивания в существующий
объект можно добавить новое свойство.
Например, оператор
joe
= new person (“Иванов”);
создает новый объект типа person с именем joe, который имеет только одно свойство - name.
Слайд 46Теперь при выполнении оператора
joe.age = 30;
в
этот объект joe будет добавлено новое свойство age.
При этом
другие объекты типа person останутся нетронутыми,
то есть свойство age будет иметь только экземпляр объекта joe.
Слайд 47
Удаление объектов и свойств
Удалить объект или его свойство
можно
путем присваивания объекту
или свойству значение null.
После удаления объекта или
свойства
обратиться к нему будет невозможно.
Слайд 48Создание методов
(для третьего способа)
Метод определяется
так же как и обычная функция программы,
а потом связывается
с объектом, используя синтаксис
object.methodName = function_Name;
где
object - имя существующего объекта;
methodName - имя связанного метода;
function_Name - имя функции.
Слайд 49Внимание: При связывании метода с функцией не указываются круглые скобки
().
Если Вы укажите круглые скобки, то это будет не
связывание, а вызов созданной функции.
Для вызова метода используется синтаксис:
object.methodName (parameters);
То есть при вызове метода используются параметры, которые были определены при создании функции.
Слайд 50Определение метода можно включать в определение объекта.
Создадим новую функцию
для вывода всей информации о человеке:
function show_Details ()
{
var
persDet =
"Name: " + this.e_name.name + "\n" +
"Email: " + this.e_address;
alert (persDet);
}
Слайд 51 Изменим определение функции emailAddr, чтобы включить в нее ссылку
на функцию show_Details():
function emailAddr (name_arg, addr_arg)
{
this.e_name = name_arg;
this.e_address = addr_arg;
this.showDetails = show_Details;
}
Слайд 52 Теперь функцию show_Details() можно вызвать с помощью оператора
e1.showDetails();
Так как переменная e1 является ссылкой на объект emailAddr,
который, в свою очередь, является ссылкой на объект person с помощью переменной p1, то в результате выполнения функции будет выведена следующая информация:
Name: Петров В.Г.
Email: petrov@pmi.donetsk.ua
Слайд 53
Добавление новых
методов – конструкторов в объект
Все объекты имеют
свойство prototype для создания новых конструкторов объекта.
Пусть countChars() – функция
подсчета появления символа в строке, что находится в аргументе.
Тогда создание нового метода происходит по следующему синтаксису:
String. prototype.count = countChars;
Слайд 54
count – новый метод, что станет конструктором объекта String;
countChars
– ссылка на функцию countChars().
После этого новый метод count может
быть применен к любому объекту типа String.
Слайд 55
Пример:
……………….
function countChars (arg)
{ var hits = 0;
pos =
this.toLowerCase().indexOf(arg);
while ( pos != -1 )
{ hits ++;
pos = this.toLowerCase().indexOf(arg,pos+1);
}
return(hits);
}
Слайд 56
String. prototype.count = countChars;
//Привязка функции countChars (arg) к
//
новому методу count объекта String.
var myStr = new String(“Некоторая строка
нового текста”);
var numChar = myStr.count(“o”);
alert(“Здесь символ ‘o’ встречается” + numChar + “раз”);
……………………….
Слайд 57
Оператор this внутри функции ссылается на тот объект,
что будет идти с методом count.
В примере - переменной
numChar присвоено значение выражения myStr.count(“o”).
Определение метода count() при помощи свойства prototype привязывает функцию countChars (). То есть при обращение к методу count() вызывается функция countChars().
Слайд 58
Вывод:
Функция – метод-конструктор добавляется только через свойство prototype,
которое при обращении к добавленному конструктору упоминать не надо.
Слайд 59
Отражение объектов
Механизм отражения позволяет выяснить, какие свойства и методы
существуют у объекта.
В JavaScript есть простой способ для этого
– это применение цикла for…in.
Например,
for (name in obj)
{
var value = obj[name];
document.writeln (name+” ”+ value +”
”);
}
Слайд 60
Объект Function
Функции немного напоминают методы классов из объектно-ориентированных языков
(ООЯ), таких как Java и C#, но на самом деле
довольно сильно от них отличаются.
В JavaScript Function – объект верхнего уровня, существующий независимо от других объектов, в отличии от методов объектов в ООЯ. Любая функция в JavaScript является объектом типа Function.
Слайд 61
1. Объявление функций
Работа с функциями делится на два этапа:
а)
В начале мы объявляем функцию, определяя код, который должен выполняться
при вызове этой функции;
б) потом вызываем эту функцию (или какой-то объект вызывает ее за нас).
Существует два базовых способа объявления функции:
Слайд 62
- можно объявить именованную функцию как объект верхнего уровня;
-
можно объявить встроенную функцию.
Объявление именованной функции
В этом случае синтаксис объявления
будет выглядеть примерно как в других скриптовых языках, например, в PHP.
Слайд 63
Пример 1.
function Hello ()
{ return “Hello World!”}
Hello();
В этом
случае функция определяется на этапе синтаксического анализа. В этом синтаксисе
ничего особенного нет.
Слайд 64
Объявление как встроенной функции (анонимной)
Пример 2.
var Hello = function
()
{ return “Hello World!” }
Hello();
А в этом случае функция определяется
в момент выполнения.
Здесь мы объявили переменную верхнего уровня Hello и присвоили ей значение.
Слайд 65
В данном случае значением является анонимная функция, определенная с
помощью ключевого слова function ().
Этот код практически эквивалентен коду
из Примера 1, но он показывает один интересный способ применения встраиваемых или анонимных функций.
Слайд 66
Пример 3.
var greeter =
{
traditional : function
()
{
return “Hello, World!”;
}
unusual : function ()
{
return “howdy, Globe!”;
}
}
Слайд 67
Здесь greeter – это объект, объявленный с помощью синтаксиса
JSON.
У этого объекта есть два свойства, которые представляют собой
анонимные функции, объявленные с помощью того же синтаксиса, что и в Примере 2.
Обращение к функции: greeter.traditional();
Слайд 68
После выполнения этого кода у нас не будет глобальных
ссылок на данные функции,
а будет только ссылка на сам
объект greeter, и мы сможем обращаться
- к функциям
и
- к свойствам этого объекта.
Слайд 69
В этом примере мы практически создали объект с методами.
Во
всех трех примерах происходит одно и то же – создание
объектов Function. Единственное различие примеров 1 и 2 от примера 3 – в способе обращения к созданной функции.
Слайд 70
Создать функцию можно не только конструкцией function, но и
с помощью конструктора Function:
var имя_функции = new Function ([arg_n1,
[... Arg_nN,]] тело_функции)
Все параметры являются строками.
Вначале определяется список формальных параметров, а потом строка, содержащая операторы тела функции.
Слайд 71
Пример 4.
Задание функции с одним числовым параметром, возвращающей
произведение этого числа на число PI:
var PI_n = new
Function
("n",
"if (typeof n != 'number')
{ l=null}
else
{l= n*Math.PI};
return l;");
Слайд 72
Вызов объявленной функции PI_n:
а) PI_n (6); //
ответ 18.849555
б) PI_n (“abc”); // ответ null
Слайд 73
Можно создать ссылки переменных на функции.
Пример 5:
function f1 ()
{alert(“Функция 1”)};
function f2 () {alert(“Функция 2”)};
if (i == 1) {func
= f1} else {func = f2};
func();
Здесь мы при i = 1 привязываем к переменной func функцию f1(), иначе - функцию f2().
Слайд 74
Аналогично можно создать ссылки элементов массива на функции и
вызывать эти функции через элемент массива.
Пример 6.
function f1 ()
{alert(“Функция 1”)};
function f2 () {alert(“Функция 2”)};
var Arr = new Array ();
Arr[0] = f1;
Arr[1] = f2;
for (i=0; i < Arr.length; i++) {Arr [i] ()};
Слайд 75
Свойства объекта Function
1. Свойство-прототип, которое позволяет любому объекту Function
выступать в роли конструктора объекта. В этом случае функция должна
вызываться с помощью ключевого слова new.
Слайд 76
2. Свойство length, которое позволяет определить, сколько формальных
параметров было использовано при определении функции.
Слайд 77
3. Свойство аrguments – списковый массив, хранящий переданные в
функцию фактические параметры.
Этот массив создается при входе в тело
функции.
Локальный объект arguments имеет следующие свойства:
Слайд 78
а) length - количество фактических параметров переданных функции при
ее вызове. Это количество можно узнать так:
аrguments. length
или
function_name.аrguments. length
Слайд 79
Пример 1:
function calls (q,r)
{
alert(calls.length);
alert(arguments.length);
return sum
(q,r)
}
calls (1,2,3,4,5);
Тогда ответы будут такими:
calls.length => 2
arguments.length => 5
Слайд 80
б) Свойство callee - всегда ссылается на функцию, которая
выполняется в данный момент и поэтому возвращает ссылку на саму
себя.
Является свойством объекта arguments функции, а не самой функции.
Это свойство обеспечивает возможность рекурсивного вызова безымянных функций.
Слайд 81
Пример 2:
function F ()
{
if (x
arguments.callee(x - 1)};
}
var result1 = F(6);
document.write (result1 + "
");
result1 => 720
Слайд 82
Пример 3:
function Factorial ()
{
document.write(‘Создаем анонимную функцию
вычисления факториала
');
return function (x)
{
if (x <= 1) return 1;
return x * arguments.callee(x - 1);
};
}
Слайд 83
var result1 = Factorial ()(6);
document.write (result1
+ "
");
result1 => 720
var result2 = Factorial (6);
document.write (result2 + "
");
result2 => ответа нет
Слайд 84
4. Свойство caller - возвращает ссылку
на объект Function,
представляющий
функцию, вызвавшую исходную.
Если свойство имеет значение null, то
функция вызвана из верхнего уровня
сценария, а не из другой функции.
Слайд 85
Пример 4:
function Vizov1 (q,r)
{
document.write("1. Vizov1.length = "
+ Vizov1.length + "
");
document.write("2. arguments.length = " + arguments.length
+ "
");
}
Слайд 86
1. Vizov1 (5,10);
2. Vizov1 (5,10,15,20);
При первом вызове Vizov1
будет:
1. Vizov1.length = 2
2. arguments.length = 2
При втором
Vizov1 :
1. Vizov1.length = 2
2. arguments.length = 4
Слайд 87
Пример 5:
function Vizov2 (q,r)
{ return sum (q,r) }
function
sum (a,b)
{
document.write(“3. sum.caller=“ +sum.caller + “
”);
document.write("4. sum.arguments.callee
= " + sum.arguments.callee + "
");
document.write("5. arguments.callee = " + arguments.callee + "
");
return a + b;
}
Слайд 88
var r2 = Vizov2 (5,10,35,40);
document.write(r2 + "
");
Результаты работы
этих функций:
3. sum.caller = function Vizov2(q, r) { return sum(q,
r); }
Слайд 89
4. sum.arguments.callee = function
sum(a, b)
{ document.write("3. sum.caller
= " + sum.caller + "");
document.write("4. sum.arguments.callee = "
+ sum.arguments.callee + ""); document.write("5. arguments.callee = " + arguments.callee + "");
return a + b; }
Слайд 90
5. arguments.callee = function sum(a, b)
{ document.write("3. sum.caller
= " + sum.caller + "");
document.write("4. sum.arguments.callee = "
+ sum.arguments.callee + ""); document.write("5. arguments.callee = " + arguments.callee + "");
return a + b; }
15
Слайд 91
! Все свойства объекта Function становятся доступными только при
ее вызове.
Поэтому доступ к ним возможен только из тела
функции.
Слайд 92
Методы объекта function
служат для вызова функции
a) метод call()
– принимает произвольное количество аргументов:
- первый аргумент зарезервирован под объект
контекста функции
(рассмотрим немного позднее);
- последующие аргументы передаются функции как ее аргументы, то есть второй аргумент метода call() будет первым аргументом функции и т.д.
Слайд 93
Пример.
var f = function (name, age)
{
return {name:name,
age:age};
}
f.call(null, Vova,20);
Свойство name будет иметь Vova,
а свойство age – 20.
Слайд 94
b) метод apply () – работает почти так же,
но он ожидает,
- что все аргументы для вызова функции
будут помещены в массив, передаваемый методу apply () в виде второго аргумента;
- все аргументы после второго будут игнорироваться.
Слайд 95
Продолжение примера:
f. apply (null, [Vova,20]);
Свойство name также будет иметь
значение Vova,
а свойство age – 20.
Слайд 96
Контекст функции
Так как объекты Function являются объектами верхнего уровня,
то это позволяет обращаться с ними не только как методами
объектов.
Это меняет весь образ написания кода в функциях и передачи им аргументов.
В JavaScript оператор this обозначает объект, метод которого вызывается.
Слайд 97
Пусть мы объявили объект, содержащий свойство:
var c =
{item: “лекция”};
Мы здесь поместили в объект свойство item. Если нам
нужен метод, которым будем считывать значение этого свойства, то это свойство можно обозначить как this.item, например:
var c =
{ item: “лекция”,
describe: finction ()
{“Я нахожусь на”+ this.item}
};
Слайд 98
При взгляде на этот код возникает впечатление, что мы
создали объект с методом, но это не так.
Функция не привязана
к объекту, поэтому объект будет передаваться ей как скрытый дополнительный аргумент при вызове.
Ключевое слово this обозначает этот скрытый аргумент, который называется объектом контекста.
(Во многих ООЯ присутствует этот механизм, в чем отличие?)
Слайд 99
В JavaScript с помощью методов Function.call() и Function.apply() мы
можем заменить объект контекста другим.
Пример:
var p={item:”tea”, act:”drink”};
var c=
{ item: ”chair”,
act: ”sitting in”,
ask: function
()
{return “who’s been”+this.act+” my ”+this.item;}
};
Слайд 100
Первый вызов: c.ask();
Результат: “who’s been sitting in my chair”
Второй
вызов: c.ask.call(p);
Результат: “who’s been drink my tea”
В этом примере –
два объекта:
p – чай,
c – кресло.
В каждом объекте – два свойства:Item и act: act описывает способ возможного взаимодействия с предметом.
Слайд 101
Мы определили функцию ask(), которая создает простые предложения.
Но
мы её прикрепили к объекту c, а не p.
Поэтому
мы можем вызвать её для кресла простым оператором c.ask(),
но чтобы вызвать её для чая, нам понадобилось применить метод call():
c.ask.call(p).
Слайд 102
Для второго случая мы обращаемся к функции как c.ask(),
а потом передаем p как первый (и данном случае единственный)
аргумент при вызове call().
Когда функция ask() вызывается таким способом, то она относится к объекту p, а не c.
Для применения функции к разным многим объектам лучше определить тип объекта с конструктором и прототипом, как мы это делали ранее в теме
”Добавление новых методов – конструкторов в объект”.