В теле функции свойство arguments.length
определяет количество аргументов, переданных функции. Однако свойство length
самой функции имеет иной смысл. Это свойство, доступное только для чтения, возвращает количество аргументов, которое функция ожидает получить, - число объявленных параметров.
В следующем фрагменте определяется функция с именем check(),
получающая массив аргументов arguments
от другой функции. Она сравнивает свойство arguments.length
(число фактически переданных аргументов) со свойством arguments. callee.length
(число ожидаемых аргументов), чтобы определить, передано ли функции столько аргументов, сколько она ожидает. Если значения не совпадают, генерируется исключение. За функцией check()
следует тестовая функция f()
, демонстрирующая порядок использования функции check():
// Эта функция использует arguments.callee, поэтому она
// не будет работать в строгом режиме,
function check(args) {
var actual = args.length; // Фактическое число аргументов
var expected = args.callee.length; // Ожидаемое число аргументов
if (actual !== expected) // Если не совпадают, генерируется исключение
throw new Еrror("ожидается: " + expected + получено " + actual);
}
function f(x, у, z) {
// Проверить число ожидаемых и фактически переданных аргументов.
check(arguments);
// Теперь выполнить оставшуюся часть функции как обычно
return х + у + z;
}
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 ():
Читать дальше
Конец ознакомительного отрывка
Купить книгу