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 < 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 < 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>
|