JavaScript
prototipação, closure e encapsulamento
@sr_valeriano


• Desenvolvedor e Instrutor na Caelum
• ricardo.valeriano@caelum.com.br
(oh yes, I wen’t there)
Object
> mafagafo = new Object()
> typeof(mafagafo)
  “object”

> pessoa = { }
> typeof(pessoa)
  ”object”
Properties
> supimpa = { }
> supimpa[‘agora-sim’] = ‘ (: ’

> supimpa.awesome = ‘YaY!’

> supimpa.tudo-batuta = ‘oples’
  x ReferenceError
Functions
> coisinha = function() {}
> typeof(coisinha)
  “function”

> coisinha[‘sera?’] = ‘¬¬’
> coisinha[‘sera?’]
  ‘¬¬’
Functions são Objects
> meChama = function(what) {
  console.log(what);
  console.log(typeof(this));
}

> meChama(“lágrimaAAs”)
  lágrimaAAs
  “object”

> meChama.apply(nil, [“lágrimaAAs”])
  lágrimaAAs
  “object”
Prototype
> Object.prototype
   Object
> go = {}
> go.say
   undefined
> Object.prototype.say = function() {
   console.log(‘no, and no, and no’);
}
> go.say
   function() { ... }
> go.say()
   no, and no, and no

> go.toString()
classe?????

> mafagafo = new Object()
> typeof(mafagafo)
  “object”

> typeof(Object)
  “function”
Object Prototype

> Object.prototype.say = function() {
   console.log(‘no, and no, and no’);
}
Herança
> Construtor = function() { };

> parent = {id:’2’};
> Construtor.prototype = parent;

> child = new Construtor();
> console.log(child.id)
 2
Escopo
> mundo = {eh: ‘global’}
> pessoa = {
     miolos:function() {
       var pensa = function() {
         console.log(‘o mundo é:’+ mundo.eh);
       }
       pensa();
     }
}
> pessoa.miolos()
   “o mundo é global”

> pensa
   undefined
Escopo
> pessoa = {
     miolos:function() {
        var pensa = function() {
          console.log(‘Estou escondida!’);
        }
        pensa();
     }
}
> pessoa.miolos()
  Estou Escondida!

> pensa
   undefined
Referências
Referência
> cabeca = (function() {
      var ideias = {uma:‘social network’};
      return {
        getIdeias:function() {
          return ideias;
        }
      }
})();
> ideias
      undefined
> cabeca.getIdeias()
      {uma:‘social network’}
> cabeca.getIdeias().outra = ‘javascript’
> cabeca.getIdeias()
      {uma:‘social network’, outra:‘javascript’}
Referência
> cabeca = (function() {
      var ideias = {uma:‘social network’};
      return {
        getIdeias:function() {
          return ideias;
        }
      }
})();
> ideias
      undefined
> cabeca.getIdeias()
      {uma:‘social network’}
> cabeca.getIdeias().outra = ‘javascript’
> cabeca.getIdeias()
      {uma:‘social network’, outra:‘javascript’}
Closure
> contexto = function() {
  var bijeto = { go: ‘go’ }
  var elefante = function() {
    console.log(bijeto[“go”]);
  }
  elefante();
}
> console.log( contexto() )
  go
Encapsulamento
> cabeca = function() {
   var ideias = {uma:‘social network’};
   return {
     getIdeias:function() {
       return Object.create(ideias);
     }
   }
};

> cabeca.getIdeias()
   {uma:‘social network’}
> cabeca.getIdeias().outra = ‘javascript’
> cabeca.getIdeias()
   {uma:‘social network’}
É isso! Obrigadasso.
      @sr_valeriano

ricardo.valeriano@caelum.com.br

JavaScript: prototipação, closure e encapsulamento

  • 1.
  • 2.
    @sr_valeriano • Desenvolvedor eInstrutor na Caelum • ricardo.valeriano@caelum.com.br
  • 4.
    (oh yes, Iwen’t there)
  • 5.
    Object > mafagafo =new Object() > typeof(mafagafo) “object” > pessoa = { } > typeof(pessoa) ”object”
  • 6.
    Properties > supimpa ={ } > supimpa[‘agora-sim’] = ‘ (: ’ > supimpa.awesome = ‘YaY!’ > supimpa.tudo-batuta = ‘oples’ x ReferenceError
  • 7.
    Functions > coisinha =function() {} > typeof(coisinha) “function” > coisinha[‘sera?’] = ‘¬¬’ > coisinha[‘sera?’] ‘¬¬’
  • 8.
    Functions são Objects >meChama = function(what) { console.log(what); console.log(typeof(this)); } > meChama(“lágrimaAAs”) lágrimaAAs “object” > meChama.apply(nil, [“lágrimaAAs”]) lágrimaAAs “object”
  • 10.
    Prototype > Object.prototype Object > go = {} > go.say undefined > Object.prototype.say = function() { console.log(‘no, and no, and no’); } > go.say function() { ... } > go.say() no, and no, and no > go.toString()
  • 11.
    classe????? > mafagafo =new Object() > typeof(mafagafo) “object” > typeof(Object) “function”
  • 12.
    Object Prototype > Object.prototype.say= function() { console.log(‘no, and no, and no’); }
  • 13.
    Herança > Construtor =function() { }; > parent = {id:’2’}; > Construtor.prototype = parent; > child = new Construtor(); > console.log(child.id) 2
  • 14.
    Escopo > mundo ={eh: ‘global’} > pessoa = { miolos:function() { var pensa = function() { console.log(‘o mundo é:’+ mundo.eh); } pensa(); } } > pessoa.miolos() “o mundo é global” > pensa undefined
  • 15.
    Escopo > pessoa ={ miolos:function() { var pensa = function() { console.log(‘Estou escondida!’); } pensa(); } } > pessoa.miolos() Estou Escondida! > pensa undefined
  • 16.
  • 17.
    Referência > cabeca =(function() { var ideias = {uma:‘social network’}; return { getIdeias:function() { return ideias; } } })(); > ideias undefined > cabeca.getIdeias() {uma:‘social network’} > cabeca.getIdeias().outra = ‘javascript’ > cabeca.getIdeias() {uma:‘social network’, outra:‘javascript’}
  • 18.
    Referência > cabeca =(function() { var ideias = {uma:‘social network’}; return { getIdeias:function() { return ideias; } } })(); > ideias undefined > cabeca.getIdeias() {uma:‘social network’} > cabeca.getIdeias().outra = ‘javascript’ > cabeca.getIdeias() {uma:‘social network’, outra:‘javascript’}
  • 21.
    Closure > contexto =function() { var bijeto = { go: ‘go’ } var elefante = function() { console.log(bijeto[“go”]); } elefante(); } > console.log( contexto() ) go
  • 22.
    Encapsulamento > cabeca =function() { var ideias = {uma:‘social network’}; return { getIdeias:function() { return Object.create(ideias); } } }; > cabeca.getIdeias() {uma:‘social network’} > cabeca.getIdeias().outra = ‘javascript’ > cabeca.getIdeias() {uma:‘social network’}
  • 23.
    É isso! Obrigadasso. @sr_valeriano ricardo.valeriano@caelum.com.br

Notas do Editor

  • #2 \n
  • #3 \n
  • #4 A mais mal compreendida das linguagens, malditos form validations.\nTem mais boas partes do que parece.\n
  • #5 A mais mal compreendida das linguagens, malditos form validations.\nTem mais boas partes do que parece.\n
  • #6 É muito simples criar um objeto em javascript (object literal)\n
  • #7 Um objeto pode ter propriedades, dot-notation funciona sob certas condições...\n
  • #8 Funções são, na verdade, objetos.\nObjetos podem ter propriedades, que podem ser funções.\nPodem ser invocadas via sintaxe especial...\n
  • #9 guardo em variáveis e invoco com o método apply.\n
  • #10 JavaScript tem mecanismo de herança SIM, várias formas de implementar isso, uma delas é via prototipagem\n
  • #11 Podemos adicionar propriedades dinamicamente a um objeto, mesmo que ele já exista.\n
  • #12 Não existem classes em javascript, Object na verdade é uma função\n
  • #13 Alteramos o prototype de Object, que na verdade é uma função...\n\nE todo objeto tem referência oculta a esse prototype, por isso agora todo objeto tem a função say.\n
  • #14 Por isso é possível fazer alterando o prototype de uma função e construindo objetos dela.\n
  • #15 Toda variável criada fora de uma função (ou sem a palavra var) é global.\n
  • #16 só dentro da função miolos é possível acessar a função pensa.\nescopo de função\n
  • #17 Todo objeto javascript é passado via referência, sem cópias quando passado como param.\n
  • #18 Se alterarmos um objeto que foi retornado, ainda que ele esteja escondido pelo escopo de função, vamos alterar a referência.\n
  • #19 Podemos nos aproveitar da memória...\nUma função se lembra o contexto onde foi criada. CLOSURE.\n
  • #20 o objeto elefante se lembra do objeto bijeto\n
  • #21 Agora tem outras questões (tá criando muito objetos). Mas funfa =)\n
  • #22 \n