Function.prototype.call()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since julio de 2015.
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
thisArgOpcional-
El valor a usar como
thiscuando se llama afunction.Advertencia: En ciertos casos,
thisArgpuede no ser el valor actual visto por el método.Si el método es una función en non-strict mode,
nullyundefinedserá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 una vez y heredarlo a otro objeto, sin tener que reescribir el método en el nuevo objeto.
Nota:
Mientras la sintaxis de esta función es casi identica a la función 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.
Nota:
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);
}