Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Nas Entranhas do JavaScript: Meta Programação

Nas Entranhas do JavaScript: Meta Programação

Talk apresentada no Front In POA 2016.
Nela explico um pouco sobre as features disponíveis em JavaScript para fazermos meta programação e tento apresentar casos de uso reais e exemplos simples.

Lucas Fernandes da Costa

December 10, 2016
Tweet

More Decks by Lucas Fernandes da Costa

Other Decks in Programming

Transcript

  1. É A CAPACIDADE DE UM PROGRAMA LER E ALTERAR À

    SI MESMO OU OUTROS EM TEMPO DE EXECUÇÃO
  2. Mas não é disso que vamos falar Isso é Meta

    Programação Meta Level JavaScript
  3. Mas não é disso que vamos falar Isso é Meta

    Programação Meta Level JavaScript Base Level Java
  4. Meta Object Protocol Prevê um vocabulário (um protocolo) que define

    como são feitas as operações sobre objetos
  5. Property Descriptors meuObjeto value enumerable writable configurable get set any

    boolean boolean boolean function function propriedade
  6. Indica o valor da propriedade value enumerable writable configurable get

    set any boolean boolean boolean function function Property Descriptors
  7. Indica se ela será listada por funções como Object.keys value

    enumerable writable configurable get set any boolean boolean boolean function function Property Descriptors
  8. Indica se ela pode ser definida com o operador de

    atribuição (=) value enumerable writable configurable get set any boolean boolean boolean function function Property Descriptors
  9. Indica se o descritor dessa propriedade pode ser alterado value

    enumerable writable configurable get set any boolean boolean boolean function function Property Descriptors
  10. É a função que será invocada para acessar a propriedade

    value enumerable writable configurable get set any boolean boolean boolean function function Property Descriptors
  11. É a função que será invocada ao atribuir um valor

    para a propriedade (operador de atribuição) value enumerable writable configurable get set any boolean boolean boolean function function Property Descriptors
  12. Getters Lazy Properties cesta dataNasc value: 08/05/1995 peso 800 frutas

    {banana: 3, morango: 1} Muitas atribuições ao peso! Poucos acessos!
  13. Getters Lazy Properties pessoa dataNasc value: 08/05/1995 idade get: function

    cesta peso frutas {banana: 1, morango: 1} get: function cesta.peso
  14. Getters Lazy Properties pessoa dataNasc value: 08/05/1995 idade get: function

    pessoa dataNasc value: 08/05/1995 idade get: function cesta peso frutas {banana: 1, morango: 1} get: function invoca a função get cesta.peso
  15. Getters Lazy Properties pessoa dataNasc value: 08/05/1995 invoca a função

    get idade get: function 200 pessoa dataNasc value: 08/05/1995 idade get: function pessoa dataNasc value: 08/05/1995 cesta.peso idade get: function cesta peso frutas {banana: 1, morango: 1} get: function
  16. Setters Múltiplas Atribuições pessoa nomeCompleto pessoa.nomeCompleto = ‘João Silva' invoca

    a função set passando ‘João Silva’ set: function primeiroNome value: '' sobrenome value: ''
  17. Setters Múltiplas Atribuições pessoa nomeCompleto pessoa.nomeCompleto = ‘João Silva' invoca

    a função set passando ‘João Silva’ set: function primeiroNome value: '' sobrenome value: '' pessoa nomeCompleto set: function primeiroNome value: '' sobrenome value: ''
  18. Setters Múltiplas Atribuições pessoa nomeCompleto pessoa.nomeCompleto = ‘João Silva' invoca

    a função set passando ‘João Silva’ set: function primeiroNome value: '' sobrenome value: '' pessoa nomeCompleto set: function primeiroNome value: 'João' sobrenome value: 'Silva'
  19. COMPOSIÇÃO DE UM PROXY Proxy Wrapper handler get set: function

    set set: function target nome value: ‘João' sobrenome value: ‘Silva' Traps
  20. FUNCIONAMENTO DE UM PROXY Proxy Wrapper target nome value: ‘João'

    sobrenome value: ‘João' const p = new Proxy(target, handler);
  21. FUNCIONAMENTO DE UM PROXY Proxy Wrapper target nome value: ‘João'

    sobrenome value: ‘João' handler get function set function const p = new Proxy(target, handler);
  22. FUNCIONAMENTO DE UM PROXY Proxy Wrapper target nome value: ‘João'

    sobrenome value: ‘João' handler get function set function const p = new Proxy(target, handler); p
  23. FUNCIONAMENTO DE UM PROXY Proxy Wrapper target nome value: ‘João'

    sobrenome value: ‘João' handler get function set function const p = new Proxy(target, handler); p.nome Pede a propriedade ao wrapper
  24. FUNCIONAMENTO DE UM PROXY Proxy Wrapper target nome value: ‘João'

    sobrenome value: ‘João' handler get function set function const p = new Proxy(target, handler); p.nome Chama a trap get passando target e nome da propriedade
  25. FUNCIONAMENTO DE UM PROXY Proxy Wrapper target nome value: ‘João'

    sobrenome value: ‘Silva' handler get function set function const p = new Proxy(target, handler); p.nome Devolve o retorno da função da trap get
  26. 0 1 2 3 0 2 4 undefined pares[3] Arrays

    Infinitos Proxy Wrapper get function
  27. 0 1 2 3 0 2 4 undefined pares[3] Arrays

    Infinitos Proxy Wrapper get function
  28. 0 1 2 3 0 2 4 undefined pares[3] Arrays

    Infinitos Proxy Wrapper get function
  29. 0 1 2 3 0 2 4 undefined pares[3] Arrays

    Infinitos Proxy Wrapper get function Calcula o valor que deveria estar no índice 3
  30. 0 1 2 3 0 2 4 undefined pares[3] Arrays

    Infinitos Proxy Wrapper get function Calcula o valor que deveria estar no índice 3
  31. Sugestões de Propriedades pessoa target nome value: ‘João' sobrenome value:

    ‘João' handler get function set function pessoa.seuNome
  32. Sugestões de Propriedades pessoa target nome value: ‘João' sobrenome value:

    ‘João' handler get function set function pessoa.seuNome
  33. Sugestões de Propriedades pessoa target nome value: ‘João' sobrenome value:

    ‘João' handler get function set function pessoa.seuNome
  34. Sugestões de Propriedades pessoa target nome value: ‘João' sobrenome value:

    ‘João' handler get function set function pessoa.seuNome Você quis dizer: "nome"?
  35. O que são symbols? Novo tipo primitivo "Symbols are all

    about Reflection within implementation" Keith Cirkel
  36. symbols no mundo real pessoa nome value: 'João' sobrenome value:

    'Silva' marcaTimestamp(pessoa) pessoa nome value: 'João' sobrenome value: 'Silva' timestamp value: 1481236691
  37. symbols no mundo real pessoa nome value: 'João' sobrenome value:

    'Silva' marcaTimestamp(pessoa) pessoa nome value: 'João' sobrenome value: 'Silva' timestamp value: 1481236691 Facilmente sobrescrito por engano
  38. symbols no mundo real pessoa nome value: 'João' sobrenome value:

    'Silva' marcaTimestamp(pessoa) pessoa nome value: 'João' sobrenome value: 'Silva' symbol(time) value: 1481236691
  39. symbols no mundo real pessoa nome value: 'João' sobrenome value:

    'Silva' marcaTimestamp(pessoa) pessoa nome value: 'João' sobrenome value: 'Silva' value: 1481236691 symbol(time) nunca haverá conflito!
  40. Utilizado por um objeto para verificar se outro objeto é

    considerado uma instância sua Well Known Symbols Symbol.hasInstance