Function.prototype.call()
O método call()
realiza a chamada de uma função com o parâmetros this
além de outros parâmetros fornecidos individualmente.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Sintaxe
func.call([thisArg[, arg1, arg2, ...argN]])
Parâmetros
thisArg
Optional- O valor de
this
fornecido ao chamarfunc
.
Aviso: Em certos casos, thisArg
pode não ser o valor que o método vê.
Se o método for uma função em non-strict mode, null
e undefined
são substituídos pelo objeto global, e valores primitivos são convertidos em objetos.
arg1, arg2, ...argN
Optional- Parâmetros para a função.
Resultado
O resultado ao chamar a função em questão com os parâmetros this
e os outros argumentos especificados.
Descrição
call()
permite uma função / método pertencendo a um objeto, ser atribuída a outro objeto e ser chamada desse mesmo.
call()
fornece um novo valor para this
à função / método. Com call()
, pode escrever um método uma vez, e depois herdar o método noutro objeto, sem ter de rescrever a função para o novo objeto.
Nota: Apesar de a sintaxe da função ser quase idêntica à da apply()
, a principal diferença é que call()
aceita uma lista de argumentos (arg1, arg2, ...argN
), enquanto apply()
aceita uma matriz de argumentos ([arg1, arg2, ...argN]
).
Exemplos
Usar call
para encadear construtores dum objeto
É possível utilizar call
para encadear construtores para um objeto (como em Java).
No exemplo abaixo, o construtor para o objeto Product
é definido com dois parâmetros: name
e price
.
Duas outras funções, Food
e Toy
, invocam Product
passando os parâmetros this
, name
e price
. As funções Food
e Toy
também definem a propriadade category
.
function Product(name, price) {
this.name = name;
this.price = price;
}
function Food(name, price) {
Product.call(this, name, price);
this.category = 'food';
}
function Toy(name, price) {
Product.call(this, name, price);
this.category = 'toy';
}
const cheese = new Food('feta', 5);
const fun = new Toy('robot', 40);
Usar call
para invocar uma função anónima
Neste exemplo, criamos uma função anónima e utilizamos call
para invocá-la em cada objeto na matriz.
O principal objetivo da função anónima é inserir a função print
em cada objeto. A função print
imprimir o índice do objeto na matriz em que se encontra.
Passar o objeto desta forma (como this
) não é necessário, mas foi feito de forma a exemplificar a função.
var animals = [
{ species: 'Lion', name: 'King' },
{ species: 'Whale', name: 'Fail' }
];
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);
}
Usar call
para invocar a função sem especificar o primeiro argumento
No exemplo abaixo, quando chamamos a função display
sem passar o primeiro argumento. Se o primeiro argumento não é especificado, o objeto global é atribuído a this
.
var sData = 'Wisen';
function display() {
console.log('sData value is %s ', this.sData);
}
display.call(); // sData value is Wisen
Aviso: Em "strict mode", o valor de this
é undefined
, exemplificado em baixo.
'use strict';
var sData = 'Wisen';
function display() {
console.log('sData value is %s ', this.sData);
}
display.call(); // Cannot read the property of 'sData' of undefined
Especificações
Especificação |
---|
ECMAScript (ECMA-262) The definition of 'Function.prototype.call' in that specification. |
Browser compatibility
BCD tables only load in the browser