javascript: potenciando la web desde 1995

117
Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio) JavaScript: Potenciando la web desde 1995

Upload: adwe-team

Post on 12-Jun-2015

1.837 views

Category:

Technology


2 download

DESCRIPTION

Presentación de Carlos Benítez @etnassoft y Enrique Amodeo @eamodeorubio sobre Javascript para ADWE Madrid

TRANSCRIPT

Page 1: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Page 2: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Indice  

-­‐  Introducción  al  lenguaje  -­‐  El  JavaScript  me  confunde  -­‐   Buenas  prácCcas  y  patrones  -­‐   AJAX,  HIJAX,  SPI  y  otras  cosas  malas  -­‐   El  futuro  de  JavaScript  

Page 3: Javascript: potenciando la web desde 1995

Introducción  al  lenguaje  

Page 4: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

CaracterísCcas  de  lenguaje  JavaScript:  

-­‐  Interpretado  (no  compilado)  -­‐  Lenguaje  de  ejecución  en  cliente  -­‐  Tipado  blando  (no-­‐Cpado)  -­‐  Orientado  a  objetos  

Page 5: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

CaracterísCcas  del  lenguaje  

Lenguaje  Interpretado  

-­‐  No  es  un  lenguaje  compilado  -­‐  Cada  instrucción  se  interpreta  en  Cempo  de  ejecución  -­‐  La  opCmización  del  código  se  realiza  durante  la  fase  de  diseño.  

Page 6: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Lenguaje  Interpretado  

Seguridad,  autoría  y  rendimiento  

-­‐  El  código  aparece  tal  cual  -­‐  Compromete  la  seguridad  de  una  lógica  críCca  -­‐  A  mayor  tamaño  de  archivo,  mayor  Cempo  de  carga  

Page 7: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Lenguaje  Interpretado  

Soluciones  poco  afortunadas:  

-­‐  Compresión  del  código:  JSMin  -­‐  Ofuscación:  YUI  Compressor,  Packer  

Inconvenientes:  

-­‐  Capa  muy  débil  de  seguridad  -­‐  Ilegibilidad  del  código  para  adaptarlo  

Page 8: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Herramientas  para  medir  la  calidad  del  soZware  

Lenguaje  Interpretado  

Page 9: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Herramientas  para  medir  la  calidad  del  soZware  

Douglas  Crockford   Developers  

Lenguaje  Interpretado  

Page 10: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

CaracterísCcas  del  lenguaje  

Tipado  blando,  dinámico  o  no-­‐Cpado  

-­‐  Las  variables  se  declaran  sin  un  Cpo  de  datos  concreto  -­‐  De  hecho,  es  posible  no  declarar  variables  de  forma  explícita  -­‐  Los  Cpos  no  son  inalterables  -­‐  La  coerción  de  datos  interna  determina  el  manejo  de  los  datos.  

Page 11: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Tipado  dinámico  y  coerción  de  datos  

Tipado  blando,  dinámico  o  no-­‐Cpado  

-­‐  Las  variables  se  declaran  sin  un  Cpo  de  datos  concreto  -­‐  De  hecho,  es  posible  no  declarar  variables  de  forma  explícita  -­‐  Los  Cpos  no  son  inalterables  -­‐  La  coerción  de  datos  interna  determina  el  manejo  de  los  datos.  

Coerción  de  datos  interna  

Page 12: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

CaracterísCcas  del  lenguaje  

Orientado  a  objetos  

-­‐  Alto  nivel  de  abstracción  -­‐  No  implementa  el  concepto  de  clases  -­‐  Se  fundamenta  en  los  protoCpos  

Page 13: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Objetos  en  JavaScript  

Tipos  de  EnCdades  JavaScript  

PRIMITIVAS  -­‐  undefined  -­‐  null  -­‐  booleanos  -­‐  cadenas  -­‐  números  

OBJETOS  

-­‐  Todo  lo  demás  

Page 14: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Tipos  de  EnCdades  JavaScript  

PRIMITIVAS  -­‐  undefined  -­‐  null  -­‐  booleanos  -­‐  cadenas  -­‐  números  

OBJETOS  

-­‐  Todo  lo  demás  constructores  

Objetos  en  JavaScript  

Page 15: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Tipos  de  EnCdades  JavaScript  

PRIMITIVAS  -­‐  undefined  -­‐  null  -­‐  booleanos  -­‐  cadenas  -­‐  números  

OBJETOS  

-­‐  Todo  lo  demás  constructores  

Boolean   Number  String  

Objetos  en  JavaScript  

Page 16: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Tipos  de  EnCdades  JavaScript  

PRIMITIVAS  -­‐  undefined  -­‐  null  -­‐  booleanos  -­‐  cadenas  -­‐  números  

OBJETOS  

-­‐  Todo  lo  demás  constructores  

Boolean   Number  String  

Objetos  en  JavaScript  

Page 17: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Tipos  de  EnCdades  JavaScript  

PRIMITIVAS  

-­‐  undefined  -­‐  null  

OBJETOS  

-­‐  Todo  lo  demás  

Objetos  en  JavaScript  

Page 18: Javascript: potenciando la web desde 1995

El  JavaScript  me  confunde  (O  por  qué  JavaScript  no  2ene  nada  que  ver  con  Java)  

Page 19: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

El  JavaScript  me  confunde  

-­‐  ECMAScript:  una  especificación  con  muchos  sabores  

-­‐  JavaScript:  Netscape  Corp.    -­‐  AcConScript:  Macromedia  -­‐  JScript:  Internet  Explorer  -­‐  V8:  Google  Chrome  -­‐  Mozilla's  JavaScript:  Firefox  -­‐  Rhino  (Java)  -­‐  KJS  (KDE):  Conqueror  -­‐  JavaScriptCore:  Apple  Inc.  

TraceMonkey  

SpiderMonkey  

Page 20: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

El  JavaScript  me  confunde  Objetos  abiertos   var  treintaYDos  =  new  Number(32);  

treintaYDos.duplicar  =  funcNon(){          return  2  *  this;  };  

alert(treintaYDos.duplicar());

Page 21: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

El  JavaScript  me  confunde  Objetos  abiertos   var  pepe  =  "      Pepe\t\n";  

String.prototype.trim  =  funcNon(){          return  this.replace(/^\s+/g,  '').replace(/\s+$/g,  '');  };  

alert(pepe.trim());  

Page 22: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

El  JavaScript  me  confunde  Scopes   var  defaultConfiguraNon  =  {  

       'maxLives':  3,          'level':  'intermediate'  };  

var  play  =  funcNon(gameConfig){          var  configuraNon  =  gameConfig  ||  defaultConfiguraNon;          score  =  0;          //  ..  do  some  play  };

Page 23: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

El  JavaScript  me  confunde  Scopes   var  defaultConfiguraNon  =  {  

       'maxLives':  3,          'level':  'intermediate'  };  

var  play  =  funcNon(gameConfig){          var  configuraNon  =  gameConfig  ||  defaultConfiguraNon;          score  =  0;          //  ..  do  some  play  };

Global  

Page 24: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

El  JavaScript  me  confunde  Scopes   var  defaultConfiguraNon  =  {  

       'maxLives':  3,          'level':  'intermediate'  };  

var  play  =  funcNon(gameConfig){          var  configuraNon  =  gameConfig  ||  defaultConfiguraNon;          score  =  0;          //  ..  do  some  play  };

Local  

Page 25: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

El  JavaScript  me  confunde  Scopes   var  ratePlayer  =  funcNon(score){  

 if(score  ==  0){      var  isALoser  =  true;    }    return  isALoser;  

};

No  problem  !  

Page 26: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

El  JavaScript  me  confunde  Closures   var  crearSaludo  =  funcNon(mensaje){  

       var  saludo  =  funcNon(porConsola){                  var  mensajeSaludo  =  mensaje  +  "  "  +  nombre;                  if  (porConsola)                            console.log(mensajeSaludo);                  else                            alert(mensajeSaludo);          };          mensaje  =  mensaje  ||  "Hola";          var  nombre  =  "Juan";          return  saludo;  };  var  quePasaJuan  =  crearSaludo("Que  pasa");  quePasaJuan(false);  var  holaJuan  =  crearSaludo();  holaJuan(true);

Page 27: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

El  JavaScript  me  confunde  Closures   var  crearSaludo  =  funcNon(mensaje){  

       var  saludo  =  funcNon(porConsola){                  var  mensajeSaludo  =  mensaje  +  "  "  +  nombre;                  if  (porConsola)                            console.log(mensajeSaludo);                  else                            alert(mensajeSaludo);          };          mensaje  =  mensaje  ||  "Hola";          var  nombre  =  "Juan";          return  saludo;  };  var  quePasaJuan  =  crearSaludo("Que  pasa");  quePasaJuan(false);  var  holaJuan  =  crearSaludo();  holaJuan(true);

Page 28: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

El  JavaScript  me  confunde  Closures   SCOPE  GLOBAL  

…..  

(CLOSURE)  crearSaludo  

“mensaje”  

“saludo”  

“nombre”  

(LOCAL)  saludo  “porConsola”  

“mensajeSaludo”  

Page 29: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

El  JavaScript  me  confunde  Closures   SCOPE  GLOBAL  

…..  

(CLOSURE)  crearSaludo  

“mensaje”  

“saludo”  

“nombre”  

(LOCAL)  saludo  “porConsola”  

“mensajeSaludo”  

Orden  de  búsqueda  

Page 30: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

El  JavaScript  me  confunde  Closures   SCOPE  GLOBAL  

…..  

(CLOSURE)  crearSaludo  

“mensaje”  

“saludo”  

“nombre”  

(LOCAL)  saludo  “porConsola”  

“mensajeSaludo”  

Orden  de  búsqueda  

Cuidado  con:  ✖ Excesivo  tamaño  de  scope  ✖ Excesivo  numero  de  scopes  anidados  

Page 31: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

El  JavaScript  me  confunde  Closures   var  crearSaludo  =  funcNon(mensaje){  

       var  saludo  =  funcNon(porConsola){                  var  mensajeSaludo  =  mensaje  +  "  "  +  nombre;                  if  (porConsola)                            console.log(mensajeSaludo);                  else                            alert(mensajeSaludo);          };          mensaje  =  mensaje  ||  "Hola";          var  nombre  =  "Juan";          return  saludo;  };  var  quePasaJuan  =  crearSaludo("Que  pasa");  quePasaJuan(false);  var  holaJuan  =  crearSaludo();  holaJuan(true);

Page 32: Javascript: potenciando la web desde 1995

Buenas  prácCcas  y  patrones  (O  cómo  podemos  aprovechar  realmente  JavaScript)  

Page 33: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  

Patrones  de  Diseño  JavaScript  

-­‐  Creacionales  -­‐  Estructurales  -­‐  Comportamiento  

Page 34: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  

Patrones  de  Diseño  Más  usuales  

CREACIONALES   ESTRUCTURALES   COMPORTAMIENTO  

Factory   Module   Iterator  

Builder   Facade   Memento  

Prototype   Proxy   Observer  /  Listener  

Singleton   Decorator   Visitor  

Page 35: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

-­‐  En  JavaScript,  no  implementa  clases,  sino  protoCpos  -­‐  Los  protoCpos  son  la  base  de  la  herencia  en  la  POO  -­‐  La  herencia  protospica  y  su  cadena  

ProtoNpos  

Buenas  prácCcas  y  patrones  

Page 36: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

ProtoCpos  

Page 37: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

var  a  =  {    first  :  'Hello',    second  :  'World',    sum  :  funcNon(x,  y){  

         return  x  +  y;    }  

};  var  b  =  {    difference  :  funcNon(x,  y){  

         return  x  -­‐  y;        },        __proto__  :  a  };    var  c  =  {        product  :  funcNon(x,  y){          return  x  *  y;        },        __proto__  :  a  };  

Herencia  Protohpica  

Page 38: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

console.log(  a.sum(  4,  6  )  );  //  10  console.log(  b.sum(  3,  2  )  );  //  5  console.log(  c.first  );  //  Hello  

Herencia  Protohpica  

var  a  =  {    first  :  'Hello',    second  :  'World',    sum  :  funcNon(x,  y){  

         return  x  +  y;    }  

};  var  b  =  {    difference  :  funcNon(x,  y){  

         return  x  -­‐  y;        },        __proto__  :  a  };    var  c  =  {        product  :  funcNon(x,  y){          return  x  *  y;        },        __proto__  :  a  };  

Page 39: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

console.log(  a.sum(  4,  6  )  );  //  10  console.log(  b.sum(  3,  2  )  );  //  5  console.log(  c.first  );  //  Hello  

Herencia  Protohpica  

var  a  =  {    first  :  'Hello',    second  :  'World',    sum  :  funcNon(x,  y){  

         return  x  +  y;    }  

};  var  b  =  {    difference  :  funcNon(x,  y){  

         return  x  -­‐  y;        },        __proto__  :  a  };    var  c  =  {        product  :  funcNon(x,  y){          return  x  *  y;        },        __proto__  :  a  };  

Page 40: Javascript: potenciando la web desde 1995

var  a  =  {    first  :  'Hello',    second  :  'World',    sum  :  funcNon(x,  y){  

         return  x  +  y;    }  

};  var  b  =  {    difference  :  funcNon(x,  y){  

         return  x  -­‐  y;        },        __proto__  :  a  };    var  c  =  {        product  :  funcNon(x,  y){          return  x  *  y;        },        __proto__  :  a  };  

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

console.log(  a.sum(  4,  6  )  );  //  10  console.log(  b.sum(  3,  2  )  );  //  5  console.log(  c.first  );  //  Hello  

Herencia  Protohpica  

Page 41: Javascript: potenciando la web desde 1995

var  a  =  {    first  :  'Hello',    second  :  'World',    sum  :  funcNon(x,  y){  

         return  x  +  y;    }  

};  var  b  =  {    difference  :  funcNon(x,  y){  

         return  x  -­‐  y;        },        __proto__  :  a  };    var  c  =  {        product  :  funcNon(x,  y){          return  x  *  y;        },        __proto__  :  a  };  

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

console.log(  a.sum(  4,  6  )  );  //  10  console.log(  b.sum(  3,  2  )  );  //  5  console.log(  c.first  );  //  Hello  

Herencia  Protohpica  

Page 42: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

var  someCar  =  {        drive:  funcNon()  {};        name:  'Mazda  3'          };    

//  Use  Object.create  to  generate  a  new  car    var  anotherCar  =  Object.create(someCar);    anotherCar.name  =  'Toyota  Camry';      

Patrón  ProtoNpo  (ECMAScript  5)  

Buenas  prácCcas  y  patrones  

Page 43: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  Patrón  Módulo   //  Namespace  for  the  library  

var  MyLibrary  =  {};  

//  Library  definiCon  MyLibrary  =  (funcNon  ()  {      //  Private  variables  /  properCes      var  p1,  p2;  

   //  Private  methods      funcNon  aPrivateMethod()  {      }  

   //  Public  API      return  {          publicMethod:  funcNon  ()  {        //  Code  funcCon...          

       }      }  }());  

MyLibrary  =  (funcNon(){      //  Code  goes  here...  }());  

Page 44: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  Patrón  Módulo   //  Namespace  for  the  library  

var  MyLibrary  =  {};  

//  Library  definiCon  MyLibrary  =  (funcNon  ()  {      //  Private  variables  /  properCes      var  p1,  p2;  

   //  Private  methods      funcNon  aPrivateMethod()  {      }  

   //  Public  API      return  {          publicMethod:  funcNon  ()  {        //  Code  funcCon...          

       }      }  }());  

MyLibrary  =  (funcNon(){      //  Code  goes  here...  }());  

Función  autoejecutable  

Page 45: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  Patrón  Módulo   //  Namespace  for  the  library  

var  MyLibrary  =  {};  

//  Library  definiCon  MyLibrary  =  (funcNon  ()  {      //  Private  variables  /  properCes      var  p1,  p2;  

   //  Private  methods      funcNon  aPrivateMethod()  {      }  

   //  Public  API      return  {          publicMethod:  funcNon  ()  {        //  Code  funcCon...          

       }      }  }());  

MyLibrary  =  (funcNon(){      //  Code  goes  here...  }());  

Función  autoejecutable  

Page 46: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  Patrón  Módulo  Ampliado:  submódulos   //  Namespace  for  the  library  

var  MyLibrary  =  {};  

//  Library  definiCon  MyLibrary  =  (funcNon  (  )  {      //  Private  variables  /  properCes      var  p1,  p2;  

   //  Private  methods      funcNon  aPrivateMethod()  {      }  

   //  Public  API      return  {          publicMethod:  funcNon  ()  {        //  Code  funcCon...          

       }      }  }(  ));  

Page 47: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  Patrón  Módulo  Ampliado:  submódulos   //  Namespace  for  the  library  

var  MyLibrary  =  {};  

//  Library  definiCon  MyLibrary  =  (funcNon  (  )  {      //  Private  variables  /  properCes      var  p1,  p2;  

   //  Private  methods      funcNon  aPrivateMethod()  {      }  

   //  Public  API      return  {          publicMethod:  funcNon  ()  {        //  Code  funcCon...          

       }      }  }(  ));  

var  MyLibrary  =  (  funcNon(  module  ){      

   module.foo  =  funcNon(){              };  

   return  module;  

}(  MyLibrary  ));  

Page 48: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  Patrón  Módulo  Ampliado:  submódulos   //  Namespace  for  the  library  

var  MyLibrary  =  {};  

//  Library  definiCon  MyLibrary  =  (funcNon  (  )  {      //  Private  variables  /  properCes      var  p1,  p2;  

   //  Private  methods      funcNon  aPrivateMethod()  {      }  

   //  Public  API      return  {          publicMethod:  funcNon  ()  {        //  Code  funcCon...          

       }      }  }(  ));  

var  MyLibrary  =  (  funcNon(  module  ){      

   module.foo  =  funcNon(){              };  

   return  module;  

}(  MyLibrary  ));  

Page 49: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  Patrón  Módulo  Ampliado:  submódulos   //  Namespace  for  the  library  

var  MyLibrary  =  {};  

//  Library  definiCon  MyLibrary  =  (funcNon  (  )  {      //  Private  variables  /  properCes      var  p1,  p2;  

   //  Private  methods      funcNon  aPrivateMethod()  {      }  

   //  Public  API      return  {          publicMethod:  funcNon  ()  {        //  Code  funcCon...          

       }      }  }(  ));  

var  MyLibrary  =  (  funcNon(  module  ){      

   module.foo  =  funcNon(){              };  

   return  module;  

}(  MyLibrary  ));  

Page 50: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  Patrón  Módulo  Ampliado:  submódulos   //  Namespace  for  the  library  

var  MyLibrary  =  {};  

//  Library  definiCon  MyLibrary  =  (funcNon  (  )  {      //  Private  variables  /  properCes      var  p1,  p2;  

   //  Private  methods      funcNon  aPrivateMethod()  {      }  

   //  Public  API      return  {          publicMethod:  funcNon  ()  {        //  Code  funcCon...          

       }      }  }(  ));  

var  MyLibrary  =  (  funcNon(  module  ){      

   module.foo  =  funcNon(){              };  

   return  module;  

}(  MyLibrary  ));  

Page 51: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  Patrón  Módulo  Revelado  (Revealing  Module)  

var  MyLibrary  =  (funcNon  ()  {      //  Private  variables  /  properCes      var  p1,  p2;  

   //  Private  methods      funcNon  aPrivateMethod()  {      }  

   //  Public  Method      funcNon  publicMethod  ()  {      }  

   //  Another  Public  Method      funcNon  anotherPublicMethod  ()  {      }  

   //  Public  API      return  {          publicMethod:  publicMethod,          anotherPublicMethod:  anotherPublicMethod      }  }());  

MyLibrary  =  (funcNon(){      //  Code  goes  here...  }());  

Page 52: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  Patrón  Módulo  Revelado  (Revealing  Module)  

var  MyLibrary  =  (funcNon  ()  {      //  Private  variables  /  properCes      var  p1,  p2;  

   //  Private  methods      funcNon  aPrivateMethod()  {      }  

   //  Public  Method      funcNon  publicMethod  ()  {      }  

   //  Another  Public  Method      funcNon  anotherPublicMethod  ()  {      }  

   //  Public  API      return  {          publicMethod:  publicMethod,          anotherPublicMethod:  anotherPublicMethod      }  }());  

return  {          publicMethod:  publicMethod,          anotherPublicMethod:  anotherPublicMethod      }  

Page 53: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  Patrón  Módulo  Revelado  (Revealing  Module)  

return  {          publicMethod:  publicMethod,          anotherPublicMethod:  anotherPublicMethod      }  

var  MyLibrary  =  (funcNon  ()  {      //  Private  variables  /  properCes      var  p1,  p2;  

   //  Private  methods      funcNon  aPrivateMethod()  {      }  

   //  Public  Method      funcNon  publicMethod  ()  {      }  

   //  Another  Public  Method      funcNon  anotherPublicMethod  ()  {      }  

   //  Public  API      return  {          publicMethod:  publicMethod,          anotherPublicMethod:  anotherPublicMethod      }  }());  

Page 54: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  This  Namespace  Proxy  (James  Edwards)  

var  myApp  =  {};  (funcNon(){      //  Private  variables  /  properCes      var  foo  =  'Hello';      var  bar  =  'World';  

   //Private  method      var  myMessage  =  funcNon(){          return  foo  +  '  '  +  bar;      };  

   //  Public  Method      this.sum  =  funcNon(  param1,  param2  ){          return  param1  +  param2;      };  

}).apply(  myApp  );  

   this.sum  =  funcNon(  param1,  param2  ){          return  param1  +  param2;      };  

Page 55: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  This  Namespace  Proxy  (James  Edwards)  

   this.sum  =  funcNon(  param1,  param2  ){          return  param1  +  param2;      };  

var  myApp  =  {};  (funcNon(){      //  Private  variables  /  properCes      var  foo  =  'Hello';      var  bar  =  'World';  

   //Private  method      var  myMessage  =  funcNon(){          return  foo  +  '  '  +  bar;      };  

   //  Public  Method      this.sum  =  funcNon(  param1,  param2  ){          return  param1  +  param2;      };  

}).apply(  myApp  );  

Page 56: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  FuncNon  Factory   ns.convertToFancyBtn  =  funcNon(fancyBtnId,  msg){  

       var  myBumon  =  document.getElementById(fancyBtnId);          myBu}on.onclick  =  funcNon(){                  alert(msg);          };  };  //.....  ns.convertToFancyBtn('btn1',  'Hola  mundo');

Page 57: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  FuncNon  Factory   ns.convertToFancyBtn  =  funcNon(fancyBtnId,  msg){  

       var  myBumon  =  document.getElementById(fancyBtnId);          myBu}on.onclick  =  funcNon(){                  alert(msg);          };  };  //.....  ns.convertToFancyBtn('btn1',  'Hola  mundo');

Enlazados  por  la  Closure  

Page 58: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  FuncNon  Factory   ns.convertToFancyBtn  =  funcNon(fancyBtnId,  msg){  

       var  myBumon  =  document.getElementById(fancyBtnId);          myBu}on.onclick  =  funcNon(){                  alert(msg);          };  };  //.....  ns.convertToFancyBtn('btn1',  'Hola  mundo');

Pero  estos  también  

(y  no  se  usan)  

Page 59: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  FuncNon  Factory   ns.convertToFancyBtn  =  funcNon(fancyBtnId,  msg){  

       var  myBumon  =  document.getElementById(fancyBtnId);          myBu}on.onclick  =  funcNon(){                  alert(msg);          };  };  //.....  ns.convertToFancyBtn('btn1',  'Hola  mundo');

Pero  estos  también  

(y  no  se  usan)  

✖ Referencias  circulares  ✖ Memoria  ✖ Confusión  ✖ Resolución  referencias  

Page 60: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  FuncNon  Factory   ns.newNoCfier  =  funcNon(msg){  

       return  funcNon(){                  alert(msg);          }  };  ns.convertToFancyBtn  =  funcNon(fancyBtnId,  msg){          var  myBumon  =  document.getElementById(fancyBtnId);          myBu}on.onclick  =  ns.newNoCfier(msg);  };  //.....  ns.convertToFancyBtn('btn1',  'Hola  mundo');

Page 61: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  FuncNon  Factory   ns.newNoCfier  =  funcNon(msg){  

       return  funcNon(){                  alert(msg);          }  };  ns.convertToFancyBtn  =  funcNon(fancyBtnId,  msg){          var  myBumon  =  document.getElementById(fancyBtnId);          myBu}on.onclick  =  ns.newNoCfier(msg);  };  //.....  ns.convertToFancyBtn('btn1',  'Hola  mundo');

 Control  de  la  closure  

 ReuClizable  

 Sencillo  y  legible  

Page 62: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  FuncNon  Factory  (“this”  Binding)  

ns.bindFuncConToObject  =  funcNon(f,  obj){          if  (typeof(f)  !=  'funcNon')                    return  obj;          return  funcNon(){                  f.apply(obj,  arguments);          }  };  //.....  submitBtn.onclick  =  ns.bindFuncConToObject(  

               controller.checkForm                  ,  controller);

Page 63: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  FuncNon  Factory  (“this”  Binding)  

ns.bindFuncConToObject  =  funcNon(f,  obj){          if  (typeof(f)  !=  'funcNon')                    return  obj;          return  funcNon(){                  f.apply(obj,  arguments);          }  };  //.....  submitBtn.onclick  =  ns.bindFuncConToObject(  

               controller.checkForm                  ,  controller);

Page 64: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  FuncNon  Factory  (“this”  Binding)  

ns.bindFuncConToObject  =  funcNon(f,  obj){          if  (typeof(f)  !=  'funcNon')                    return  obj;          return  funcNon(){                  f.apply(obj,  arguments);          }  };  //.....  submitBtn.onclick  =  ns.bindFuncConToObject(  

               controller.checkForm                  ,  controller);

Page 65: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  ¡  Curry  !   ns.fadeOut=funcNon(trigger,  Nme,  selector)  {  

//  ..  Some  visual  FX  code  };  //...  ns.fadeOut('onclick',  200,  'coolForm');  ns.fadeOut('onclick',  200,  'warningMsg');

Page 66: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  ¡  Curry  !   ns.fadeOut=funcNon(trigger,  Nme,  selector)  {  

//  ..  Some  visual  FX  code  };  //...  ns.fadeOut('onclick',  200,  'coolForm');  ns.fadeOut('onclick',  200,  'warningMsg');

✖ RepeCCvo  y  laborioso  ✖ Fácil  equivocarnos  ✖ Di~cil  de  mantener  ✖ No  es  legible  (intent)  

Page 67: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  ¡  Curry  !  (John  Resig)  

FuncCon.prototype.curry  =  funcNon(){          var  fn  =  this;          var  fixedArgs  =  Array.prototype.slice.call(arguments);          return  funcNon(){                  return  fn.apply(this,  fixedArgs.concat(  

         Array.prototype.slice.call(arguments)));          };  };  //...  ns.fastFadeOutWhenClicked=ns.fadeOut.curry('onclick',  200);  //..  ns.fastFadeOutWhenClicked('coolForm');  ns.fastFadeOutWhenClicked('warningMsg');

Page 68: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  ¡  Curry  !  (John  Resig)  

FuncCon.prototype.curry  =  funcNon(){          var  fn  =  this;          var  fixedArgs  =  Array.prototype.slice.call(arguments);          return  funcNon(){                  return  fn.apply(this,  fixedArgs.concat(  

         Array.prototype.slice.call(arguments)));          };  };  //...  ns.fastFadeOutWhenClicked=ns.fadeOut.curry('onclick',  200);  //..  ns.fastFadeOutWhenClicked('coolForm');  ns.fastFadeOutWhenClicked('warningMsg');

Argumentos  transformados  en  

array  

Page 69: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  ¡  Curry  !  (John  Resig)  

FuncCon.prototype.curry  =  funcNon(){          var  fn  =  this;          var  fixedArgs  =  Array.prototype.slice.call(arguments);          return  funcNon(){                  return  fn.apply(this,  fixedArgs.concat(  

         Array.prototype.slice.call(arguments)));          };  };  //...  ns.fastFadeOutWhenClicked=ns.fadeOut.curry('onclick',  200);  //..  ns.fastFadeOutWhenClicked('coolForm');  ns.fastFadeOutWhenClicked('warningMsg');

Page 70: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  ¡  Curry  !  (John  Resig)  

FuncCon.prototype.curry  =  funcNon(){          var  fn  =  this;          var  fixedArgs  =  Array.prototype.slice.call(arguments);          return  funcNon(){                  return  fn.apply(this,  fixedArgs.concat(  

         Array.prototype.slice.call(arguments)));          };  };  //...  ns.fastFadeOutWhenClicked=ns.fadeOut.curry('onclick',  200);  //..  ns.fastFadeOutWhenClicked('coolForm');  ns.fastFadeOutWhenClicked('warningMsg');

Page 71: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  ¡  Curry  !  (John  Resig)  

FuncCon.prototype.curry  =  funcNon(){          var  fn  =  this;          var  fixedArgs  =  Array.prototype.slice.call(arguments);          return  funcNon(){                  return  fn.apply(this,  fixedArgs.concat(  

         Array.prototype.slice.call(arguments)));          };  };  //...  ns.fastFadeOutWhenClicked=ns.fadeOut.curry('onclick',  200);  //..  ns.fastFadeOutWhenClicked('coolForm');  ns.fastFadeOutWhenClicked('warningMsg');

 ReuClizable   legible  (intent)  

 Flexible  

Page 72: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  OO  sin  prototype:  Encapsulación  

ns.Evento  =  funcNon(nombre){          var  id  =  nombre  ||  '<anonymous>';          var  subscriptores  =  [];          var  subscriptorYaRegistrado  =  funcNon(subscriptor){//...          };          var  noNficarSubscriptor  =  funcNon(evento,  subscriptor){//...          };          this.registrarSubscriptor  =  funcNon(subscriptor){//...          };          this.borrarSubscriptor  =  funcNon(subscriptor){//...          };          this.noNficar  =  funcNon(callback){//...          };          this.destruir  =  funcNon(){//...          };  };  //..  var  onClick  =  new  ns.Evento('onclick');

Page 73: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  OO  sin  prototype:  Encapsulación  

ns.Evento  =  funcNon(nombre){          var  id  =  nombre  ||  '<anonymous>';          var  subscriptores  =  [];          var  subscriptorYaRegistrado  =  funcNon(subscriptor){//...          };          var  noNficarSubscriptor  =  funcNon(evento,  subscriptor){//...          };          this.registrarSubscriptor  =  funcNon(subscriptor){//...          };          this.borrarSubscriptor  =  funcNon(subscriptor){//...          };          this.noNficar  =  funcNon(callback){//...          };          this.destruir  =  funcNon(){//...          };  };  //..  var  onClick  =  new  ns.Evento('onclick');

 Datos  privados  

Page 74: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  OO  sin  prototype:  Encapsulación  

ns.Evento  =  funcNon(nombre){          var  id  =  nombre  ||  '<anonymous>';          var  subscriptores  =  [];          var  subscriptorYaRegistrado  =  funcNon(subscriptor){//...          };          var  noNficarSubscriptor  =  funcNon(evento,  subscriptor){//...          };          this.registrarSubscriptor  =  funcNon(subscriptor){//...          };          this.borrarSubscriptor  =  funcNon(subscriptor){//...          };          this.noNficar  =  funcNon(callback){//...          };          this.destruir  =  funcNon(){//...          };  };  //..  var  onClick  =  new  ns.Evento('onclick');

 Métodos  privados  

Page 75: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  OO  sin  prototype:  Encapsulación  

ns.Evento  =  funcNon(nombre){          var  id  =  nombre  ||  '<anonymous>';          var  subscriptores  =  [];          var  subscriptorYaRegistrado  =  funcNon(subscriptor){//...          };          var  noNficarSubscriptor  =  funcNon(evento,  subscriptor){//...          };          this.registrarSubscriptor  =  funcNon(subscriptor){//...          };          this.borrarSubscriptor  =  funcNon(subscriptor){//...          };          this.noNficar  =  funcNon(callback){//...          };          this.destruir  =  funcNon(){//...          };  };  //..  var  onClick  =  new  ns.Evento('onclick');

 Métodos  públicos  

Page 76: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  OO  sin  prototype:  Encapsulación  

ns.Evento  =  (funcNon(){          var  eventos  =  [];          var  noNficarSubscriptor  =  funcNon(evento,  subscriptor){//...          };          var  fn=funcNon(nombre){                  eventos.push(this);                  //  ...  COMO  ANTES  ...          };          fn.destruirTodosLosEventos  =  funcNon(){//...          };          return  fn;  })();  //..  var  onClick  =  new  ns.Evento('onclick');  var  onBlur  =  new  ns.Evento('onblur');  //..  ns.Evento.destruirTodosLosEventos();  

Page 77: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  OO  sin  prototype:  Encapsulación  

ns.Evento  =  (funcNon(){          var  eventos  =  [];          var  noNficarSubscriptor  =  funcNon(evento,  subscriptor){//...          };          var  fn=funcNon(nombre){                  eventos.push(this);                  //  ...  COMO  ANTES  ...          };          fn.destruirTodosLosEventos  =  funcNon(){//...          };          return  fn;  })();  //..  var  onClick  =  new  ns.Evento('onclick');  var  onBlur  =  new  ns.Evento('onblur');  //..  ns.Evento.destruirTodosLosEventos();  

 Datos  privados  estáCcos  

Page 78: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  OO  sin  prototype:  Encapsulación  

ns.Evento  =  (funcNon(){          var  eventos  =  [];          var  noNficarSubscriptor  =  funcNon(evento,  subscriptor){//...          };          var  fn=funcNon(nombre){                  eventos.push(this);                  //  ...  COMO  ANTES  ...          };          fn.destruirTodosLosEventos  =  funcNon(){//...          };          return  fn;  })();  //..  var  onClick  =  new  ns.Evento('onclick');  var  onBlur  =  new  ns.Evento('onblur');  //..  ns.Evento.destruirTodosLosEventos();  

 Metodos  privados  estáCcos  

Page 79: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  OO  sin  prototype:  Encapsulación  

ns.Evento  =  (funcNon(){          var  eventos  =  [];          var  noNficarSubscriptor  =  funcNon(evento,  subscriptor){//...          };          var  fn=funcNon(nombre){                  eventos.push(this);                  //  ...  COMO  ANTES  ...          };          fn.destruirTodosLosEventos  =  funcNon(){//...          };          return  fn;  })();  //..  var  onClick  =  new  ns.Evento('onclick');  var  onBlur  =  new  ns.Evento('onblur');  //..  ns.Evento.destruirTodosLosEventos();  

 Metodos  publicos  estáCcos  

Page 80: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

Buenas  prácCcas  y  patrones  OO  sin  prototype:  Tipos  parametrizables  

ns.Evento  =  funcNon(noNficarSubscriptor){          var  eventos  =  [];          var  fn=funcNon(nombre){//  ...          };          fn.destruirTodosLosEventos  =  funcNon(){//...          };          return  fn;  };  ns.EventoDirecto  =  ns.Evento(noCficadorSimple);  ns.EventoDiferido  =  ns.Evento(noCficadorSegundoPlano);  ns.EventoRemoto  =  ns.Evento(noCficadorAJAX);  //..  var  onClickRemoto  =  new  ns.EventoRemoto('onclick');  

Page 81: Javascript: potenciando la web desde 1995

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  (O  cómo  mimar  un  poco  a  los  usuarios)  

Page 82: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

Full  Post-­‐back  

Page 83: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

Full  Post-­‐back  (UX)  

✖ Latencia  ✖ Ancho  de  banda  ✖ Lógica  de  presentación  en  servidor  ✖ Generación  HTML  ✖ Excesiva  navegación  ✖ Detección  rápida  de  errores  

Page 84: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

Full  Post-­‐back  (UX)  

✖ Latencia  ✖ Ancho  de  banda  ✖ Lógica  de  presentación  en  servidor  ✖ Generación  HTML  ✖ Excesiva  navegación  ✖ Detección  rápida  de  errores  

Page 85: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

Full  Post-­‐back  (Ingeniería  Sozware)  

✖ Descarga  y  navegación  mezclada  ✖ Lógica  de  presentación  en  servidor  ✖ GesCón  de  la  sesión  (cookies)  ✖ Escalabilidad  (cloud)  

Page 86: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

Full  Post-­‐back  (Ingeniería  Sozware)  

✖ Descarga  y  navegación  mezclada  ✖ Lógica  de  presentación  en  servidor  ✖ GesCón  de  la  sesión  (cookies)  ✖ Escalabilidad  (cloud)  

Page 87: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

ParNal  Rendering  

Page 88: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

ParNal  Rendering  

 AJAX  al  rescate  !  

Page 89: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

ParNal  Rendering  es  sólo  un  “apaño”  

 Menos  espera   Menor  ancho  de  banda  

✖ Lógica  de  presentación  en  servidor  ✖ Generación  HTML  (pero  menos)  ✖ Excesiva  navegación  ✖ Detección  rápida  de  errores  ✖ Descarga  y  navegación  mezclada  ✖ GesCón  de  la  sesión  ✖ Escalabilidad  

Page 90: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

Single  Page  Interface  BR

OWSER   Control   Modelo  

Vista  

Aplicación  cliente  

X-­‐Browser  Framework  

AJAX  DOM  JSON/HTTP  

Descarga  

Page 91: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

Single  Page  Interface  BR

OWSER   Control   Modelo  

Vista  

Aplicación  cliente  

X-­‐Browser  Framework  

AJAX  DOM  JSON/HTTP  

Descarga  

 Procesos  independientes  

Page 92: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

Single  Page  Interface  BR

OWSER   Control   Modelo  

Vista  

Aplicación  cliente  

X-­‐Browser  Framework  

AJAX  DOM  

 Logica  completa  de  presentación  en  cliente  

 Validaciones  en  cliente   Control  de  navegación  en  cliente  

 AcCvar/DesacCvar  widgets   Generación  DOM  en  cliente  (UI)  

Page 93: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

Single  Page  Interface  BR

OWSER   Control   Modelo  

Vista  

Aplicación  cliente  

X-­‐Browser  Framework  

AJAX  DOM  

 Aislar  fabricante  browser   UClidades  

 Widget  Toolkits   jQuery,  DOJO,  Mootols,  etc.  

Page 94: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

Single  Page  Interface  BR

OWSER   Control   Modelo  

Vista  

Aplicación  cliente  

X-­‐Browser  Framework  

AJAX  DOM  JSON/HTTP  

 Llamadas  a  servidor  sólo  cuando  es  necesario  

 En  segundo  plano   Validación  (otra  vez)   Reglas  de  negocio  

 Persistencia  

Page 95: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

Webtop  

BROWSER  

Aplicación  X  Instancia  1  

X-­‐Browser  Framework  

AJAX  DOM  

Webtop  Framework  

Aplicación  Y  Instancia  1  

Aplicación  Z  Instancia  1  

Aplicación  X  Instancia  2  

Page 96: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

Webtop  

BROWSER  

Aplicación  X  Instancia  1  

X-­‐Browser  Framework  

AJAX  DOM  

Webtop  Framework  

Aplicación  Y  Instancia  1  

Aplicación  Z  Instancia  1  

Aplicación  X  Instancia  2  

 Varias  aplicaciones  a  la  vez  en  la  misma  página  

 Cada  una  se  descarga  por  separado  

 Descarga  dinámica  bajo  demanda  

 Varias  instancias  de  la  misma  aplicación  en  la  misma  página  

Page 97: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

Webtop  

BROWSER  

Aplicación  X  Instancia  1  

X-­‐Browser  Framework  

AJAX  DOM  

Webtop  Framework  

Aplicación  Y  Instancia  1  

Aplicación  Z  Instancia  1  

Aplicación  X  Instancia  2  

 Es  un  “contenedor”  de  aplicaciones  

 Descarga  de  aplicaciones   Ciclo  de  vida  

 Interacción  entre  aplicaciones   Servicios  comunes   Desktop  Frame  (UI)  

Page 98: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

Webtop  

BROWSER  

Aplicación  X  Instancia  1  

X-­‐Browser  Framework  

AJAX  DOM  

Webtop  Framework  

Aplicación  Y  Instancia  1  

Aplicación  Z  Instancia  1  

Aplicación  X  Instancia  2  

 No  hay  que  cambiar  de  pagina   Aplicacion  se  descarga  una  sola  

vez   Cooperacion  entre  aplicaciones   Entorno  empresarial  (focus)  

Page 99: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

HIJAX  

Page 100: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

HIJAX  

Ouch!  

Page 101: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

HIJAX  <a  href="javascript:window.open('help.html')">  

   Ayuda  !  </a>  

<a    href="#"      onclick="window.open('help.html');  return  false;">      Ayuda  !  

</a>  

<a    href="help.html"      onclick="window.open(this.getAmribute('href'));  return  false;">      Ayuda  !  

</a>  

Page 102: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

HIJAX  <a  href="javascript:window.open('help.html')">  

   Ayuda  !  </a>  

<a    href="#"      onclick="window.open('help.html');  return  false;">      Ayuda  !  

</a>  

<a    href="help.html"      onclick="window.open(this.getAmribute('href'));  return  false;">      Ayuda  !  

</a>  

Page 103: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

HIJAX  <a  href="help.html"  class="help">Ayuda  !</a>  

jQuery(funcNon($){          $('a.help').bind('click',  funcNon(){                  window.open(this.href);                  return  false;          });  });  

Markup  

Behaviour  

Page 104: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

HIJAX  <form  id=”signupForm"  acCon="/doSignup.do"  method="post">          <input  type="text"  name="username"  id="username"  />          <input  type="password"  name="pwd"  id="pwd"  />          <input  type="submit"  value="login"  />  </form>  

jQuery(funcNon($){          $(’#signupForm').submit(funcNon(){                  return  controller.checkPwdStrength(this);          });  });  

Markup  

Behaviour  

Page 105: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

AJAX,  HIJAX,  SPI  y  otras  cosas  malas  

HIJAX  

 Construye  tu  aplicacion  como  si  fuera  tradicional  (sin  JS)   Cada  contenido  en  su  propia  página   Usa  selectores  para  añadir  JS  (jQuery)  

 Separación  CSS+HTML+JS   Degradación  progresiva  de  funcionalidad   SEO  

Page 106: Javascript: potenciando la web desde 1995

El  futuro  de  JavaScript  (Harmony,  Librerías  y  Servidores)  

JavaScript:  Potenciando  la  web  desde  1995  

Page 107: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

JavaScript  a  día  de  hoy  

Lenguajes  de  Programación  2010  

1-­‐  Java:  +52%  2-­‐  C:  +11%  3-­‐  C++:  -­‐13%  4-­‐  C#:  +52%  5-­‐  JavaScript:  +76%  6-­‐  Perl:  +33%  7-­‐  PHP:  +58%  8-­‐  Visual  Basic:  +112%  9-­‐  Python:  +69%  10-­‐  Ruby:  +78%  

Page 108: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

JavaScript  a  día  de  hoy  

Lenguajes  de  Programación  2010  

Page 109: Javascript: potenciando la web desde 1995

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

JavaScript:  Potenciando  la  web  desde  1995  

JavaScript  a  día  de  hoy  

Lenguajes  de  Programación  2010  

Page 110: Javascript: potenciando la web desde 1995

ECMAScript  3.1    vs    

ECMAScript  4  

Harmony  

JavaScript:  Potenciando  la  web  desde  1995  

El  sueño  de  Brendan  Eich  

-­‐  Estructuras  OO  más  puras  -­‐  Clases  -­‐  Estandarización  de  facto  

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

Page 111: Javascript: potenciando la web desde 1995

Las  bibliotecas  y  el  éxito  jQuery  JavaScript:  Potenciando  la  web  desde  1995  

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

Page 112: Javascript: potenciando la web desde 1995

Librerías  JavaScript  JavaScript  DistribuNon  in  Top  Million  Sites  

45%

7.2%

13%

9.2%

JavaScript:  Potenciando  la  web  desde  1995  

Distribución  de  Bibliotecas  

Page 113: Javascript: potenciando la web desde 1995

Proyecto  GNOME  

-­‐  Gjs:  Spidermonkey  Engine  -­‐  Seed:  WebKit  JavaScriptCore  

/*  This  is  publicly  exported  from  async.js,  but  is  defined  here  to    *  avoid  a  circular  dependency.    *    *  The  issue  is  that  we  want  async.js  to  build  on  Promise,  but  as    *  a  nice  tweak  want  Promise.get  to  be  an  async  call  as  defined    *  in  async.js    */  let  _asyncFunc  =  funcNon(f)  {          /*  Create  a  task  from  an  Asynchronous  FuncCon,  providing  'this'              *  as  the  first  argument.  */          f.asyncCall  =  funcNon()  {                  let  params  =  Array.slice(arguments);                  let  me  =  params[0];                  params[0]  =  f;                  return  _asyncCall.apply(me,  params);          };          return  f;  };  

JavaScript  en  el  escritorio  JavaScript:  Potenciando  la  web  desde  1995  

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

Page 114: Javascript: potenciando la web desde 1995

Qué  se  echa  en  falta  en  JavaScript  

-­‐  No  existe  un  sistema  de  módulos  naCvo.  -­‐  No  posee  APIs  estándares  (file  system,  IO,  binarios...)  -­‐  No  existen  interfaces  estándares  para  BBDD  o  servidores  Web  -­‐  No  existe  una  gesCón  de  paquetes  que  controle  dependencias  

JavaScript:  Potenciando  la  web  desde  1995  

Límites  del  lenguaje  a  día  de  hoy  

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

Page 115: Javascript: potenciando la web desde 1995

Soluciones  adoptadas  

-­‐  Gran  dependencia  de  los  Patrones  de  Diseño  -­‐  Gran  dependencia  de  bibliotecas:  jQuery  -­‐  JSAN  como  repositorio  general  de  dependencias  

Incompatible!

JS  

JavaScript:  Potenciando  la  web  desde  1995  

Límites  del  lenguaje  a  día  de  hoy  

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

Page 116: Javascript: potenciando la web desde 1995

Propuesta  de  Estándar:  CommonJS  

-­‐  Módulos  -­‐  Cadenas  binarias  -­‐  Codificación  de  caracteres  -­‐  Interfaz  para  sistema  de  ficheros  (file  system)  -­‐  Sockets  -­‐  Tests  Unitarios:  afirmaciones,  ejecutado  y  reportes  -­‐  Interfaz  Web  Server:  JSGI  -­‐  GesCón  local  y  remota  de  paquetes  dependientes  

JavaScript:  Potenciando  la  web  desde  1995  

Límites  del  lenguaje  a  día  de  hoy  

Carlos Benitez (@etnassoft) Enrique Amodeo (@eamodeorubio)

Page 117: Javascript: potenciando la web desde 1995

JavaScript:  Potenciando  la  web  desde  1995  

MUCHAS GRACIAS!!!!

Enrique  J.  Amodeo  Rubio  

Twi}er:  @eamodeorubio  

Blog:  h}p://eamodeorubio.wordpress.com  

Carlos  Benítez  

Twi}er:  @EtnasSoZ  

Blog:  h}p://www.etnassoZ.com