52
JavaScript Everywhere Thiago Silva <[email protected]>

Javascript Everywhere

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Javascript Everywhere

JavaScript Everywhere

Thiago Silva<[email protected]>

Page 2: Javascript Everywhere

09/18/07   2

Road map• A linguagem, atualmente ­ ECMA­262, 3ed.

– Meta­programação• A linguagem, amanhã ­ ECMA­262, 4ed.• Implementações

– SpiderMonkey (Mozilla C)

– Rhino (Mozilla Java)

– Tamarin (Mozilla C++)

– QSA (Qt C++)

– KJS (KDE C++)

Page 3: Javascript Everywhere

09/18/07   3

Recapitulando...• JavaScript/JScript/ActionScript/ECMAScript• Criada em 1995 para o Netscape 2• Padronizada como ECMA­262 (1997)• Última versão: ECMA­262, 3ª edição (2000)• ECMA­357 (E4X)

"I intended to actually use Scheme..." ­ Brendan Eich

Page 4: Javascript Everywhere

09/18/07   4

Fast Overview• Object oriented (protoype based)• Functional• Java­like syntax• Garbage collected• Dynamically typed

Page 5: Javascript Everywhere

09/18/07   5

O que é, o que é...

Page 6: Javascript Everywhere

09/18/07   6

Built in

Page 7: Javascript Everywhere

09/18/07   7

Orientação à Objeto

Page 8: Javascript Everywhere

09/18/07   8

Natureza dos JS objects

Page 9: Javascript Everywhere

09/18/07   9

Natureza dos JS objects

Page 10: Javascript Everywhere

09/18/07   10

Natureza dos JS objects

Page 11: Javascript Everywhere

09/18/07   11

Natureza dos JS objects

Page 12: Javascript Everywhere

09/18/07   12

Object propertiesvar palestra    = new Object;palestra.titulo = "JavaScript Everywhere";palestra.evento = "LinuxChix";

//E, com notação literal:

var palestra = {  titulo: "JavaScript Everywhere",  evento: "LinuxChix"};

Page 13: Javascript Everywhere

09/18/07   13

Object properties//Duas notações para acessar propriedades

palestra.titulo === palestra["titulo"]

//Exceto quando a chave for um número...

var obj = new Object;obj[0] = "booo";obj[0] === obj.0; //Uops!

Page 14: Javascript Everywhere

09/18/07   14

Object properties

//Eval é caro...

eval("pessoa." + key + " = " + val);

//Que tal...

pessoa[key] = val;

Page 15: Javascript Everywhere

09/18/07   15

Functions//Uma declaração comumfunction soma(x, y) {  return x + y;}//Alternativavar soma = new Function("x", "y", "return x + y");

print(soma.length); // 2

var f = function() {  arguments.callee(); //recursividade}

Page 16: Javascript Everywhere

09/18/07   16

(First­class) Functions//Declaração comumfunction soma(x, y) {  return x + y;}

function aplique(func, x, y) {  func(x, y);}

aplique(soma, 1, 2);

Page 17: Javascript Everywhere

09/18/07   17

This, that...

print(this); //Global object

Page 18: Javascript Everywhere

09/18/07   18

This, that...function f() {

  print(this); //depende!}

f(); //this == Global object

Page 19: Javascript Everywhere

09/18/07   19

This, that...function f() {

  print(this); //depende!}

var obj = new Object;

obj.func = f;

obj.func(); //this == obj

palestra.g = f;

palestra.g(); //this == palestra

Page 20: Javascript Everywhere

09/18/07   20

Herança?

• Toda função é uma construtora de objetos• Toda função tem uma propriedade chamada “prototype”• Object, Function, String, Array, etc são funções• Prototype, por default, aponta para Object.prototype (o objeto 

primordial)

Page 21: Javascript Everywhere

09/18/07   21

Anatomia

Page 22: Javascript Everywhere

09/18/07   22

Herdando...function Pessoa() {};Function Empregado(){};

Empregado.prototype = new Pessoa();

emp = new Empregado();

Page 23: Javascript Everywhere

09/18/07   23

Extendendo//Extendendo (sem especializar) classes built in

String.prototype.ultimoCaractere = function() {

  return this[this.length­1];

}

"thiago".ultimoCaractere();

Page 24: Javascript Everywhere

09/18/07   24

ExtendendoArray.prototype.each = function(func) {

  for (var i = 0; i < this.length; i++) { 

    func(this[i])

  }

}

[10,7,8].each(function(v) {

  print(v); //10, 7, 8});

Page 25: Javascript Everywhere

09/18/07   25

Closuresfunction f() {  var local = 99;

  return function() {    print(local);  }}

f()(); //exibe 99

Page 26: Javascript Everywhere

09/18/07   26

Currying Functions• Heim?!?

Page 27: Javascript Everywhere

09/18/07   27

Currying Functionsfunction soma(a,b,c){  if (arguments.length < this.soma.length) {    return curry(this.soma,arguments,this);  }  return a+b+c;}  print(add()(1,2,4));      // 7print(add(1)(2)(5));      // 8print(add(1)()(2)()(6));  // 9print(add(1,2,7,8));      // 10

Page 28: Javascript Everywhere

09/18/07   28

Fluent Interfaces//Versão normótica de um código:

    function makeOrder(customer) {

        var o1 = new Order();

        customer.addOrder(o1);

        var video = Video.find("The Simpsons");

        o1.addItem(video);

        video = Video.find("300");

        o1.addItem(video);

        video = Video.find("Transformers");

        video.setSkippable(true);

        o1.addItem(video);

        o1.setRush(true);

    }

Page 29: Javascript Everywhere

09/18/07   29

Fluent Interfaces//Nova versão

  function makeFluent(customer) {        customer.newOrder().            withVideo("The Simpsons").            withVideo("300").            withVideo("Transformers").skippable().            priorityRush();  }

Page 30: Javascript Everywhere

09/18/07   30

Metaprogramming

• O ato de escrever programas que escrevem programas• O ato de programar as estruturas da linguagem do programa

Page 31: Javascript Everywhere

09/18/07   31

DOM high­levelshow("us­state­field").

when("country").

is("United States");

show("province­field").

when("country").

is("Canada");

show("brutus").

when("us­state").

is("Ohio, Michigan");

Page 32: Javascript Everywhere

09/18/07   32

REST?var eric = User.find(1)

//GET http://localhost:3000/users/1.xml 

var floyd = User.create({

name: "Floyd Wright", 

email: "[email protected]"});

//POST http://localhost:3000/users.xml 

var chad = User.build({

email: "[email protected]", 

name: "Chad Pytel"});

chad.save(); //POST ...

Page 33: Javascript Everywhere

09/18/07   33

ClassesObject.subclass({

  nome: "Pessoa",

  atributos: ["nome", "email"],

  metodos: {

    getNome: function() {

      return this.nome;

    },

    setNome: function(nome) {

      this.nome = nome;

    }

  }

});

Pessoa.new().setNome("thiago");

Page 34: Javascript Everywhere

09/18/07   34

JavaScript on Rails?ActiveRecord.subclass({

  name: "Pessoa",

  has_many: ["livros", "compras"],

  validates_presence_of: ["senha"],

  class_methods: {

    login: function(u,p) {

      this.find("all", {

          conditions: [["username", u], ["password",p]],

          limit: 1,

          orderby: "id DESC"

      });

}}});

Page 35: Javascript Everywhere

09/18/07   35

Enquanto isso, na sala da justiça...

Page 36: Javascript Everywhere

09/18/07   36

ECMAScript edition 4

• Fases finais• "Compatibilidade" com a ed. 3• Microsoft + Mozilla + Adobe + etc + comunidade• Foco em Programming in the large• Um zilhão de adições

Page 37: Javascript Everywhere

09/18/07   37

Que adições?

Page 38: Javascript Everywhere

09/18/07   38

Classespublic dynamic class Array extends Object

{

  public static CASEINSENSITIVE = 1

  private static function toString() {

    ...

  }

  function join(sep) {

     ...

  }

}

Page 39: Javascript Everywhere

09/18/07   39

Static typing(opcional)

var nome : String = “thiago”;function f(a: int, b: Pessoa) : int { ...}

Page 40: Javascript Everywhere

09/18/07   40

Type parameters(generics)

class List<T> { public add(e: T) { ... } ...}

var pessoas : List<Pessoa>;

Page 41: Javascript Everywhere

09/18/07   41

Block Expressionslet (x=x+10, y=12) {  print(x+y);}

print( let (k=k+10, z=12)                (k+z, "hello, world!") )

for ( let i=0 ; i < 5 ; i++ )  f(i)

Page 42: Javascript Everywhere

09/18/07   42

Namespacesnamespace debugnamespace releasedebug function trace(s) { print(s) }release function trace(s) { /* do nothing */ } use namespace debugtrace("I will be printed!")

function f() {  use namespace release  trace("I won't be printed!")}

Page 43: Javascript Everywhere

09/18/07   43

Packagespackage mx.core {    class UIObject extends ...}

import acme.core.*var widget : acme.core.Widget

Page 44: Javascript Everywhere

09/18/07   44

Iterators & Generators(+ destr. assignment)

function fib() {  let i = 0, j = 1;  while (true) {    yield i;    [i, j] = [j, i + j];  }} var g = fib();for (var i = 0; i < 10; i++)  print(g.next());

Page 45: Javascript Everywhere

09/18/07   45

AlternativeClosure Syntax

function(x)xfunction(a,b)[g(),h()]foo(function(x)x,function(y)y,3)

Page 46: Javascript Everywhere

09/18/07   46

Built­in• Classes nativas escritas em JavaScript• Self­hosted

– Compilador

– Type­checker

Page 47: Javascript Everywhere

09/18/07   47

Outras adições...• [[DontEnum]] visível• Proper tail calls• Switch class• Tripple quote strings & String.trim()• Catchalls & getters/setters• Operator overloading

Page 48: Javascript Everywhere

09/18/07   48

E mais outras...• Meta objects• JSON encoding/decoding• Stack inspection• Bug fixes• arguments typeof Array• eval como operador• this bindings

Page 49: Javascript Everywhere

09/18/07   49

E mais outras..

Page 50: Javascript Everywhere

09/18/07   50

Implementações• SpiderMonkey (Mozilla C)• Rhino (Mozilla Java)• Tamarin (Mozilla C++)• QSA (Qt C++)• KJS (KDE C++)

Page 51: Javascript Everywhere

09/18/07   51

Concluíndo• JS é uma linguagem que surpreende muita gente• É pequena, o que a torna sedutora para ser embutida em aplicações• A nova edição, provavelmente, surpreenderá mais ainda.

Page 52: Javascript Everywhere

09/18/07   52

Obrigado• E­Mail: [email protected]• Jabber: tsilva@jabber­br.org• Blog: http://www.sourcecraft.info/blog