Function.prototype.call()

Сводка

Метод 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 + ' с отрицательной ценой');
  }

  return this;
}

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

Спецификации

Спецификация Статус Комментарии
ECMAScript 3-е издание. Стандарт Изначальное определение. Реализована в JavaScript 1.3.
ECMAScript 5.1 (ECMA-262)
Определение 'Function.prototype.call' в этой спецификации.
Стандарт  
ECMAScript 6 (ECMA-262)
Определение 'Function.prototype.call' в этой спецификации.
Кандидат в рекомендации  

Совместимость с браузерами

Возможность Chrome Firefox (Gecko) Internet Explorer Opera Safari
Базовая поддержка (Да) (Да) (Да) (Да) (Да)
Возможность Android Chrome для Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Базовая поддержка (Да) (Да) (Да) (Да) (Да) (Да)

Смотрите также

Метки документа и участники

Метки: 
 Внесли вклад в эту страницу: Natalya_Surikova, Mingun, teoli, fscholz
 Обновлялась последний раз: Natalya_Surikova,