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 July 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
thisArg
Opcional-
El valor a usar como
this
cuando se llama afunction
.Advertencia: 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.
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);
}