Function.prototype.call()
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Сводка
Метод call()
вызывает функцию с указанным значением this
и индивидуально предоставленными аргументами.
Примечание:
Хотя синтаксис этой функции практически полностью идентичен функции apply()
, фундаментальное различие между ними заключается в том, что функция call()
принимает список аргументов, в то время, как функция apply()
- одиночный массив аргументов.
Синтаксис
fun.call(thisArg[, arg1[, arg2[, ...]]])
Параметры
thisArg
-
Значение
this
, предоставляемое для вызова функцииfun
. Обратите внимание, чтоthis
может не быть реальным значением, видимым этим методом: если метод является функцией в нестрогом режиме, значенияnull
иundefined
будут заменены глобальным объектом, а примитивные значения будут упакованы в объекты. arg1, arg2, ...
-
Аргументы для объекта.
Описание
Вы можете присваивать различные объекты this
при вызове существующей функции. this
ссылается на текущий объект, вызвавший объект. С помощью call
вы можете написать метод один раз, а затем наследовать его в других объектах, без необходимости переписывать метод для каждого нового объекта.
Примеры
Пример: использование call
для связи конструкторов объекта в цепочку
Вы можете использовать метод call
для объединения в цепочку конструкторов объекта, как в Java. В следующем примере для объекта продукта Product
объявлен конструктор с двумя параметрами, названием name
и ценой price
. Продукт инициализирует свойства name
и price
, а специализированные функции определяют ещё категорию category
.
function Product(name, price) {
this.name = name;
this.price = price;
if (price < 0) {
throw RangeError(
"Нельзя создать продукт " + this.name + " с отрицательной ценой",
);
}
}
function Food(name, price) {
Product.call(this, name, price);
this.category = "еда";
}
Food.prototype = Object.create(Product.prototype);
function Toy(name, price) {
Product.call(this, name, price);
this.category = "игрушка";
}
Toy.prototype = Object.create(Product.prototype);
var cheese = new Food("фета", 5);
var fun = new Toy("робот", 40);
Пример: использование call
для вызова анонимной функции
В этом чисто искусственном примере, мы создаём анонимную функцию и используем call
для вызова её на каждом элементе массива. Главная задача анонимной функции здесь — добавить функцию печати в каждый объект, способную напечатать правильный индекс объекта в массиве. Передача объекта в качестве значения this
не является острой необходимостью, но мы делаем это в целях объяснения.
var animals = [
{ species: "Лев", name: "Король" },
{ species: "Кит", name: "Фэйл" },
];
for (var i = 0; i < animals.length; i++) {
(function (i) {
this.print = function () {
console.log("#" + i + " " + this.species + ": " + this.name);
};
this.print();
}).call(animals[i], i);
}
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-function.prototype.call |
Совместимость с браузерами
BCD tables only load in the browser