call() apply() y bind()
Los métodos call() apply() y bind()
son muy importantes a la hora de trabajar con objetos en JavaScript. Los utilizamos para vincular funciones externas al objeto con cual queremos trabajar. Todos estos métodos son muy similares y hacen más o menos lo mismo, pero hay pequeñas diferencias.
Veamos un ejemplo:
En el HTML tenemos un elemento canvas
<canvas id="canvas"></canvas>
En el JavaScript primero inicializamos el canvas
:
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
let cw = (canvas.width = 300);
let ch = (canvas.height = 300);
A continuación definimos algunas variables:
var color="tomato",
x= 100,
y= 100,
radio= 50;
También escribimos una función dibujar
que dibuja un circulo en el canvas.
function dibujar(dx,dy) {
ctx.fillStyle = this.color;
ctx.beginPath();
ctx.arc(this.x + dx, this.y + dy, this.radio, 0, 2 * Math.PI);
ctx.fill();
}
Por favor observe que la función dibujar
utiliza variables como this.color, this.x, this.y
. . .
En este caso this.color, this.x, this.y
. . . son variables que pertenecen al objeto window
, o sea: las variables color
, x
, y
y radio
que ya hemos declarado.
See the Pen call apply bind #0 by Gabi (@enxaneta) on CodePen.
Pero hay situaciones cuando queremos dibujar más de una pelota, y queremos animar las pelotas, y cada pelota tiene su posición y su color y su velocidad en x e y, y a lo mejor queremos darlas unáa aceleración, y actualizarlas con cada fotograma. Y todo vuelve a ser muy complicado. La solución es organizarnos mejor, y para esto necesitamos utilizar objetos.
Podemos crear objetos literales así:
var pelota = {
color: "tomato",
x: 100,
y: 100,
radio: 50
};
El método call()
Para poder dibujar la pelota
necesitamos vincular la función dibujar
al objeto pelota
, porque queremos que this.color
sea el color del objeto pelota
etc . . . Lo podemos hacer utilizando el método call().
La sintaxis de call()
es la siguiente:
nombreFuncion.call(objeto, argumentos);
Observe por favor que utilizamos el nombre de la función que queremos vincular ( sin paréntesis ) .
Retomando el ejemplo de arriba podemos escribir:
dibujar.call(pelota, 50, 50)
See the Pen call apply bind #1 by Gabi (@enxaneta) on CodePen.
El método apply()
El método apply()
es muy parecido al método call(
), con la única diferencia que tenemos que poner los argumentos en un array:
La sintaxis de apply()
es la siguiente:
nombreFuncion.apply(objeto, [el, array, de, los, argumentos]);
Retomando el ejemplo anterior podemos escribir:
dibujar.apply(pelota, [50, 50])
See the Pen call apply bind #2 by Gabi (@enxaneta) on CodePen.
El método bind()
El método bind()
, es bastante diferente ya que en lugar de vincular una función a un objeto, está creando una nueva función vinculada al objeto. La sintaxis de bind()
es:
let nuevaFuncion = nombreFuncion.bind(objeto);
Si volvemos al objeto anterior podemos escribir:
let dibujarPelota = dibujar.bind(pelota);
Esto crea una nueva función dibujarPelota()
que podemos utilizar para . . . dibujar la pelota:
dibujarPelota(50,50)
Alternativamente podemos abreviar estas dos líneas de código así:
dibujar.bind(pelota)(50,50);
See the Pen call apply bind #3 by Gabi (@enxaneta) on CodePen.