В этом руководстве вы узнаете о методе JavaScript apply() типа Function и о том, как его эффективно использовать.
Метод Function.prototype.apply() позволяет вызывать функцию с заданным значением this и аргументами, представленными в виде массива. Синтаксис:
fn.apply(thisArg, [args]);
Метод apply() принимает два аргумента:
thisArg— это значение this, предоставленное для вызова функцииfn.- Аргумент
args— это массив, который определяет аргументы функцииfn. Начиная с ES5, аргументargsможет быть массивоподобным объектом или массивом.
Метод apply() подобен методу call(), за исключением того, что он принимает аргументы функции в виде массива, а не отдельных аргументов.
Примеры
Давайте рассмотрим несколько примеров использования метода apply().
1) Пример простого метода
Предположим, что у вас есть объект person :
const person = {
firstName: 'John',
lastName: 'Doe'
}Функцию с именем greet() следующим образом:
function greet(greeting, message) {
return `${greeting} ${this.firstName}. ${message}`;
}Функция greet() принимает два параметра: greeting и message. Внутри функции greet() мы ссылаемся на объект со свойством firstName.
В следующем примере показано, как использовать метод apply() для вызова функции greet() с установленным this для объекта person :
let result = greet.apply(person, ['Hello', 'How are you?']); console.log(result);
Выход:
Hello John. How are you?
В этом примере мы устанавливаем значение this внутри функции для объекта person. Аргументы функции greet() были переданы в метод apply() в виде массива.
Метод apply() вызвал функцию greet() со значением this, установленным на объект person и аргументы в виде массива ['Hello', 'How are you?'].
Если вы используете метод call(), вам необходимо передать аргументы функции greet() отдельно следующим образом:
let result = greet.call(person, Hello', 'How are you?');
2) Заимствование функций
Метод apply() позволяет объекту заимствовать метод другого объекта без дублирования кода.
Предположим, что у вас есть следующий объект computer:
const computer = {
name: 'MacBook',
isOn: false,
turnOn() {
this.isOn = true;
return`The $ {
this.name
}
is On`;
},
turnOff() {
this.isOn = false;
return`The $ {
this.name
}
is Off`;
}
};Следующий объект server :
const server = {
name: 'Dell PowerEdge T30',
isOn: false
};Объект server не имеет turnOn() и turnOff().
Чтобы выполнить метод turnOn() объекта computer на объекте server, вы можете использовать метод apply() следующим образом:
let result = computer.turnOn.apply(server); console.log(result);
Выход:
The Dell PowerEdge T30 is On
В этом примере объект- server заимствует метод turnOn() объекта- computer.
Точно так же вы можете вызвать метод turnOff() объекта computer на объекте server:
let result = computer.turnOff.apply(server); console.log(result);
Выход:
The Dell PowerEdge T30 is Off
3) Использование для добавления массива к другому
Метод apply() позволяет добавлять элементы одного массива к другому:
let arr = [1, 2, 3]; let numbers = [4, 5, 6]; arr.push.apply(arr, numbers); console.log(arr);
В этом примере метод apply() изменяет исходный массив arr. Обратите внимание, что метод Array.prototype.concat() также дает тот же результат, за исключением того, что он возвращает новый массив вместо изменения исходного массива.
Заключение
- Метод
apply()вызывает функцию с заданным значениемthisи аргументами, предоставленными в виде массива. - Метод
apply()аналогичен методуcall(), за исключением того, что он принимает аргументы функции в виде массива, а не отдельных аргументов.
