Resumen
El m茅todo call()
llama a una funci贸n con un valor dado this
y con argumentos provistos individualmente.
Sintaxis
function.call(thisArg[, arg1[, arg2[, ...]]])
Parametros
thisArg
Optional- El valor a usar como
this
cuando se llama afunction
. -
Cuidado: En ciertos casos,
thisArg
puede no ser el valor actual visto por el m茅todo.Si el m茅todo es una funci贸n en non-strict mode,
null
yundefined
ser谩n reemplazados con el objeto global, y valores primitivos ser谩n convertidos a objetos. arg1, arg2, ...
- Argumentos para el objeto.
-
Valor de retorno
- El resultado de llamar a la funci贸n con el
this
especificado y los argumentos.
Descripci贸n
call()
permite que una funci贸n/m茅todo que pertenece a un objeto, ser asignada y llamada para un objeto diferente.
call()
provee un nuevo valor de this
a la funci贸n/m茅todo. Con call()
, puedes escribir un m茅todo ona vez y heredarlo a otro objeto, sin tener que reescribir el m茅todo en el nuevo objeto.
apply()
, la diferencia fundamental es que call()
acepta una lista de argumentos, mientras apply()
accepta un arreglo sencillo de argumentos.Ejemplos
Usando call para encadenar constructores para un objeto
Puede usar call
para encadenar constructores para un objeto (similar a Java).
En el siguiente ejemplo, el constructor para el objeto Producto
es definido con dos parametros, nombre
y precio
.
Otras dos funciones Comida
y Juguete
invocan a Producto
, pas谩ndo this
, nombre
y precio
. Producto
inicializa las propiedades nombre
y precio
, ambas funciones especializadas definen la categoria
.
function Producto(nombre, precio) {
this.nombre = nombre;
this.precio = precio;
if (precio < 0)
throw RangeError('No se puede crear el producto "' + nombre + '" con un precio negativo');
return this;
}
function Comida(nombre, precio) {
Producto.call(this, nombre, precio);
this.categoria = 'comida';
}
Comida.prototype = new Producto();
function Juguete(nombre, precio) {
Producto.call(this, nombre, precio);
this.categoria = 'juguete';
}
Juguete.prototype = new Producto();
var queso = new Comida('feta', 5);
var diversion = new Juguete('robot', 40);
Usando call para invocar una funci贸n an贸nima
En este ejemplo, creamos una funci贸n an贸nima y usamos call
para invocarla en cada objeto en un arreglo.
El prop贸sito principal de la funci贸n an贸nima aqu铆 es agregar una funci贸n print
a cada objeto, el cual puede imprimir el 铆ndice correcto en el arreglo.
Pasar el objeto como valor this
no es estrictamente necesario, pero se hace con prop贸sito explicativo.
var animales = [
{especie: 'Leon', nombre: 'Rey'},
{especie: 'Whale', nombre: 'Fail'}
];
for (var i = 0; i < animales.length; i++) {
(function (i) {
this.imprimir = function () {
console.log('#' + i + ' ' + this.especie + ': ' + this.nombre);
}
this.imprimir();
}).call(animales[i], i);
}