Вход/Регистрация
JavaScript. Подробное руководство, 6-е издание
вернуться

Флэнаган Дэвид

Шрифт:

}

8.7.2. Свойство prototype

Любая функция имеет свойство prototype, ссылающееся на объект, известный как объект прототипа. Каждая функция имеет свой объект прототипа. Когда функция используется в роли конструктора, вновь созданный объект наследует свойства этого объекта прототипа. Прототипы и свойство prototype обсуждались в разделе 6.1.3, и мы еще раз вернемся к этим понятиям в главе 9.

8.7.3. Методы call и apply

Методы

саll
и
аррlу
позволяют выполнять косвенный вызов функции (раздел 8.2.4), как если бы она была методом некоторого другого объекта. (Мы уже использовали метод
саll
в примере 6.4 для вызова
Object.prototype.toString
относительно объекта, класс которого необходимо было определить.) Первым аргументом обоим методам,
саll
и
аррlу,
передается объект, относительно которого вызывается функция; этот аргумент определяет контекст вызова и становится значением ключевого слова
this
в теле функции. Чтобы вызвать функцию
f
(без аргументов) как метод объекта о, можно использовать любой из методов,
саll
или
аррlу:

f.call(о);

f.apply(o);

Любой из этих способов вызова эквивалентен следующему фрагменту (где предполагается, что объект о не имеет свойства с именем m):

о.m = f; // Временно сделать f методом о.

о.m; // Вызывать его без аргументов,

delete о.m; // Удалить временный метод.

В строгом режиме ECMAScript 5 первый аргумент методов

саll
и
apply
становится значением
this
, даже если это простое значение,
null
или
undefined
. В ECMAScript 3 и в нестрогом режиме значения
null
и
undefined
замещаются глобальным объектом, а простое значение - соответствующим объектом-оберткой.

Все остальные аргументы метода

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

f.call(o, 1, 2);

Метод

аррlу
действует подобно методу
саll,
за исключением того, что аргументы для функции передаются в виде массива:

f.apply(o, [1,2]);

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

apply
может использоваться для вызова такой функции в контексте массива произвольной длины. Например, чтобы отыскать наибольшее число в массиве чисел, для передачи элементов массива функции
Math.max
можно было бы использовать метод
ар ply :

var biggest = Math.max.apply(Math, array_of_numbers);

Обратите внимание, что метод

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

// Замещает метод m объекта о версией метода, которая регистрирует

// сообщения до и после вызова оригинального метода.

function trace(o, m) {

var original = o[m]; // Сохранить оригинальный метод в замыкании.

o[m] = function { // Определить новый метод.

console.log(new Date, "Entering:", m); // Записать сообщение,

var result = original.apply(this, arguments): // Вызвать оригинал,

  • Читать дальше
  • 1
  • ...
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: