Resumo : neste tutorial, você aprenderá sobre o call()
método JavaScript e como usá-lo de forma mais eficaz.
Introdução ao método JavaScript call()
Em JavaScript, uma função é uma instância do Function
tipo. Por exemplo:
function add(x, y) {
return x + y;
}
console.log(add instanceof Function); // true
Linguagem de código: JavaScript ( javascript )
O Function.prototype
tipo possui o call()
método com a seguinte sintaxe:
functionName.call(thisArg, arg1, arg2, ...);
Linguagem de código: JavaScript ( javascript )
Nesta sintaxe, o call()
método chama uma função functionName
com os argumentos ( arg1
, arg2
,…) e o this
conjunto para thisArg
objeto dentro da função.
- The
thisArg
é o objeto ao qual othis
objeto faz referência dentro da funçãofunctionName
. - Os
arg1
,arg2
, .. são os argumentos da função passados para ofunctionName
.
O call()
método retorna o resultado da chamada do functionName()
.
O exemplo a seguir define a add()
função e a chama normalmente:
function add(x, y) {
return x + y;
}
let result = add(10, 20);
console.log(result); // 30
Linguagem de código: JavaScript ( javascript )
O seguinte chama a add()
função, mas usa o call()
método:
function add(x, y) {
return x + y;
}
let result = add.call(this, 10, 20);
console.log(result); // 30
Linguagem de código: JavaScript ( javascript )
Por padrão, o this
interior da função é definido como o objeto global , ou seja, window
nos navegadores da web e global
no Node.js.
Observe que no modo estrito, o this
interior da função é definido como undefined
em vez do objeto global.
Considere o seguinte exemplo:
var greeting = 'Hi';
var messenger = {
greeting: 'Hello'
}
function say(name) {
console.log(this.greeting + ' ' + name);
}
Linguagem de código: JavaScript ( javascript )
Dentro da say()
função, referenciamos o greeting
através do this
valor. Se você apenas invocar a say()
função por meio do call()
método a seguir:
say.call(this,'John');
Linguagem de código: JavaScript ( javascript )
Ele mostrará a seguinte saída para o console:
"Hi John"
Linguagem de código: JavaScript ( javascript )
No entanto, quando você invoca o call()
método do say
objeto de função e passa o messenger
objeto como this
valor:
say.call(messenger,'John');
Linguagem de código: JavaScript ( javascript )
A saída será:
"Hello John"
Linguagem de código: JavaScript ( javascript )
Neste caso, o this
valor dentro da say()
função faz referência ao messenger
objeto, não ao objeto global.
Usando o método JavaScript call() para encadear construtores para um objeto
Você pode usar o call()
método para encadear construtores de um objeto. Considere o seguinte exemplo:
function Box(height, width) {
this.height = height;
this.width = width;
}
function Widget(height, width, color) {
Box.call(this, height, width);
this.color = color;
}
let widget = new Widget('red', 100, 200);
console.log(widget);
Linguagem de código: JavaScript ( javascript )
Saída:
Widget { height: 'red', width: 100, color: 200 }
Linguagem de código: JavaScript ( javascript )
Neste exemplo:
- Primeiro, inicialize o
Box
objeto com duas propriedades:height
ewidth
. - Segundo, invoque o
call()
método doBox
objeto dentro doWidget
objeto e defina othis
valor para oWidget
objeto.
Usando o método JavaScript call() para empréstimo de função
O exemplo a seguir ilustra como usar o método call() para funções de empréstimo:
const car = {
name: 'car',
start() {
console.log('Start the ' + this.name);
},
speedUp() {
console.log('Speed up the ' + this.name);
},
stop() {
console.log('Stop the ' + this.name);
},
};
const aircraft = {
name: 'aircraft',
fly() {
console.log('Fly');
},
};
car.start.call(aircraft);
car.speedUp.call(aircraft);
aircraft.fly();
Linguagem de código: JavaScript ( javascript )
Saída:
Start the aircraft
Speed up the aircraft
Fly
Linguagem de código: JavaScript ( javascript )
Como funciona.
Primeiro, defina um objeto carro com um nome de propriedade e três métodos start
, speedUp
e stop
:
const car = {
name: 'car',
start() {
console.log('Start the ' + this.name);
},
speedUp() {
console.log('Speed up the ' + this.name);
},
stop() {
console.log('Stop the ' + this.name);
},
};
Linguagem de código: JavaScript ( javascript )
Segundo, defina o objeto aeronave com um nome de propriedade e um método:
const aircraft = {
name: 'aircraft',
fly() {
console.log('Fly');
},
};
Linguagem de código: JavaScript ( javascript )
Terceiro, chame o método start()
and speedUp()
do car
objeto e o fly()
método do aircraft
objeto. No entanto, passando the aircraft
como primeiro argumento para os métodos start()
and speedUp()
:
car.start.call(aircraft);
car.speedUp.call(aircraft);
aircraft.fly();
Linguagem de código: JavaScript ( javascript )
Dentro dos métodos start()
e , faz referência ao objeto, não ao objeto. Portanto, o retorna a string. Portanto, os métodos geram a seguinte mensagem:speedUp()
this
aircraft
car
this.name
'aircraf'
Start the aircraft
Speed up the aircraft
Linguagem de código: texto simples ( texto simples )
Tecnicamente, o aircraft
objeto empresta o método start()
e speedUp()
do car
objeto. E o empréstimo de função refere-se a um objeto que usa um método de outro objeto.
O exemplo a seguir ilustra como o arguments
objeto empresta o filter()
método de Array.prototype
através da call()
função:
function isOdd(number) {
return number % 2;
}
function getOddNumbers() {
return Array.prototype.filter.call(arguments, isOdd);
}
let results = getOddNumbers(10, 1, 3, 4, 8, 9);
console.log(results);
Linguagem de código: JavaScript ( javascript )
Saída:
[ 1, 3, 9 ]
Linguagem de código: JavaScript ( javascript )
Como funciona.
Primeiro, defina a isOdd()
função que retorna verdadeiro se o número for ímpar:
function isOdd(number) {
return number % 2;
}
Linguagem de código: JavaScript ( javascript )
Segundo, defina a getOddNumbers()
função que aceita qualquer número de argumentos e retorna um array que contém apenas números ímpares:
function getOddNumbers() {
return Array.prototype.filter.call(arguments, isOdd);
}
Linguagem de código: JavaScript ( javascript )
Neste exemplo, o arguments
objeto pega emprestado o método filter() do Array.prototype
objeto.
Terceiro, chame a getOddNumbers()
função:
let results = getOddNumbers(10, 1, 3, 4, 8, 9);
console.log(results);
Linguagem de código: JavaScript ( javascript )
Neste tutorial, você aprendeu sobre o call()
método JavaScript e como usá-lo de forma mais eficaz.