aboutsummaryrefslogtreecommitdiff
path: root/files/es/web/javascript/referencia/objetos_globales/function/call/index.html
blob: 4200c5d2a5158ad21c9007fc5b9cd82a18697e6a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
---
title: Function.prototype.call()
slug: Web/JavaScript/Referencia/Objetos_globales/Function/call
tags:
  - Function
  - JavaScript
  - Method
translation_of: Web/JavaScript/Reference/Global_Objects/Function/call
---
<div>{{JSRef("Objetos_globales", "Function")}}</div>

<h2 id="Resumen">Resumen</h2>

<p>El método <strong><code>call()</code></strong> llama a una función con un valor dado <code>this</code> y con argumentos provistos individualmente.</p>

<h2 id="Sintaxis">Sintaxis</h2>

<pre class="syntaxbox notranslate"><code><em>function</em>.call(<em>thisArg</em>[, <em>arg1</em>[, <em>arg2</em>[, ...]]])</code></pre>

<h3 id="Parametros">Parametros</h3>

<dl>
 <dt><code><em>thisArg</em></code> {{optional_inline}}</dt>
 <dd>El valor a usar como <code>this</code> cuando se llama a <em><code>function</code></em>.</dd>
 <dd>
 <div class="blockIndicator note">
 <p><strong>Cuidado:</strong> En ciertos casos, <code><em>thisArg</em></code> puede no ser el valor actual visto por el método.</p>

 <p>Si el método es una función en {{jsxref("Strict_mode", "non-strict mode", "", 1)}}, {{jsxref("Global_Objects/null", "null")}} y {{jsxref("Global_Objects/undefined", "undefined")}} serán reemplazados con el objeto global, y valores primitivos serán convertidos a objetos.</p>
 </div>
 </dd>
 <dt><code>arg1, arg2, ...</code></dt>
 <dd>Argumentos para el objeto.</dd>
 <dt>
 <h3 id="Valor_de_retorno">Valor de retorno</h3>
 </dt>
 <dd>El resultado de llamar a la función con el <code>this</code> especificado y los argumentos.</dd>
</dl>

<h2 id="Descripción">Descripción</h2>

<p><code>call()</code> permite que una función/método que pertenece a un objeto, ser asignada y llamada para un objeto diferente.</p>

<p><code>call()</code> provee un nuevo valor de <code>this</code> a la función/método. Con <code>call()</code>, puedes escribir un método ona vez y heredarlo a otro objeto, sin tener que reescribir el método en el nuevo objeto.</p>

<div class="note"><strong>Nota:</strong> Mientras la sintaxis de esta función es casi identica a la función {{jsxref("Function.apply", "apply()")}}, la diferencia fundamental es que <code>call()</code> acepta una <strong>lista de argumentos</strong>, mientras <code>apply()</code> accepta un <strong>arreglo sencillo de argumentos</strong>.</div>

<h2 id="Ejemplos">Ejemplos</h2>

<h3 id="Usando_call_para_encadenar_constructores_para_un_objeto">Usando <code>call</code> para encadenar constructores para un objeto</h3>

<p>Puede usar <code>call</code> para encadenar constructores para un objeto (similar a Java).</p>

<p>En el siguiente ejemplo, el constructor para el objeto <code>Producto</code> es definido con dos parametros, <code>nombre</code> y <code>precio</code>.</p>

<p>Otras dos funciones <code>Comida</code> y <code>Juguete</code> invocan a <code>Producto</code>, pasándo <code>this</code><code>nombre</code> y <code>precio</code>. <code>Producto</code> inicializa las propiedades <code>nombre</code> y <code>precio</code>, ambas funciones especializadas definen la <code>categoria</code>.</p>

<pre class="brush: js notranslate">function Producto(nombre, precio) {
  this.nombre = nombre;
  this.precio = precio;

  if (precio &lt; 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);
</pre>

<h3 id="Usando_call_para_invocar_una_función_anónima">Usando <code>call</code> para invocar una función anónima</h3>

<p>En este ejemplo, creamos una función anónima y usamos <code>call</code> para invocarla en cada objeto en un arreglo.</p>

<p>El propósito principal de la función anónima aquí es agregar una función <code>print</code>  a cada objeto, el cual puede imprimir el índice correcto en el arreglo.</p>

<div class="blockIndicator note">
<p>Pasar el objeto como valor <code>this</code> no es estrictamente necesario, pero se hace con propósito explicativo.</p>
</div>

<pre class="brush: js notranslate">var animales = [
  {especie: 'Leon', nombre: 'Rey'},
  {especie: 'Whale', nombre: 'Fail'}
];

for (var i = 0; i &lt; animales.length; i++) {
  (function (i) {
    this.imprimir = function () {
      console.log('#' + i  + ' ' + this.especie + ': ' + this.nombre);
    }
    this.imprimir();
  }).call(animales[i], i);
}
</pre>

<h2 id="See_also">See also</h2>

<ul>
 <li>{{jsxref("Function.prototype.bind()")}}</li>
 <li>{{jsxref("Function.prototype.apply()")}}</li>
</ul>