Ver Mensaje Individual
  #14 (permalink)  
Antiguo 05/02/2011, 20:48
Avatar de buzu
buzu
 
Fecha de Ingreso: octubre-2006
Ubicación: San Francisco, CA
Mensajes: 2.168
Antigüedad: 18 años, 1 mes
Puntos: 122
Respuesta: Crear objeto THIS

Código Javascript:
Ver original
  1. /*
  2.   Aqui estas extendiendo el prototipo del Objeto Function
  3.   y le estas agregando un método bind.
  4.   Se pueden lograr patrones muy eficientes con este modelo
  5.   pero no lo recomiendo a menos que sepas lo que haces.
  6. */
  7. Function.prototype.bind = function(scope)
  8. {
  9.     var _function = this;// aqui this hace referencia a la funcion en donde bind se ejecuta.
  10. //por ejemplo, en ej1 this hace referencia a
  11. //function(){
  12. //  alert(this);
  13. //}
  14.     return function() { //una vez que se llame a bind, se ejecuta el codigo y
  15. //la funcion original es reemplazada por esta funcion
  16. //Esta funcion simplemente toma la copia de la funcion original que guardo
  17. //hace algunas lineas y la llama con apply para poder cambiar el
  18. //contexto en el que se ejecuta, o como algunos dirian, para cambiar el
  19. //valor de this.
  20.         return _function.apply(scope, arguments);
  21.     }
  22. }
  23.  
  24. //Lo que sige son los ejemplos, no tienen mucho de especial ya que el
  25. //codigo ha sido explicado anteriormente
  26. //pero ejemplo 2 tiene otra cosa interesante.
  27. //ej 1
  28. var fn = function(){
  29.     alert(this);
  30. }.bind(objetos);
  31. fn();
  32.  
  33. //ej 2
  34. //En este ejemplo vemos que se usa una funcion anonima autoejecutable para
  35. //poder ejecutar el bind. Este tiene la particulariedad que una vez que la funcion
  36. //anonima regresa, muere y no deja huella en el ambito global. Lo mas probable
  37. //es que sea victima de garbage collector.
  38. for(var i in objetos)
  39. {
  40.     (function(){//esta es la funcion anonima auto-ejecutable.
  41.         alert(this.className);
  42.     }.bind(objetos[i]))();
  43. }
__________________
twitter: @imbuzu