Function.prototype.call()

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 a function.

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 y undefined 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 thisnombre 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);
}

See also