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

JavaScript Orientado a Objetos

Avatar for talles talles
April 09, 2015

JavaScript Orientado a Objetos

Avatar for talles

talles

April 09, 2015
Tweet

More Decks by talles

Other Decks in Programming

Transcript

  1. Um pouco de história “I thought of objects being like

    biological cells and/or individual computers on a network, only able to communicate with messages (...)” “OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.”
  2. O que falaremos hoje • Objetos; • Métodos; • Classes;

    • Interfaces; • Polimorfismo; • Recursão aberta; • Instanciação; • Herança; • Encapsulamento. • Associação; • Composição; • Padrões de projeto; • SOLID; • GRASP; • DDD.
  3. Objetos 'prop' in obj // false obj.prop = 'foo' //

    'foo' obj.prop = 'bar' // 'bar' obj.prop // 'bar' obj['prop'] // 'bar' delete obj.prop // true 'prop' in foo // false
  4. Métodos foo.bar = function () { console.log('Uma propriedade de um

    objeto aceita qualquer valor.') console.log('Inclusive uma função.') console.log('Pode me chamar de método então!') }
  5. Interfaces e Polimorfismo var gato = { nome: 'Gato', barulho:

    function () { console.log('miau') } } var pato = { nome: 'Pato', barulho: function () { console.log('quack!') } } function qualBarulho (animal) { console.log('O ' + animal.nome + ' faz:') animal.barulho() }
  6. Interfaces e Polimorfismo O código que acabamos de ver é

    polimórfico, mas existe um outro aspecto do polimorfismo que é mudar o comportamento da superclasse na subclasse. Deixemos para quando falarmos de herança.
  7. Recursão aberta this • objeto global em chamadas simples; •

    o próprio objeto em métodos; • o objeto sendo construído em chamadas com new; • o primeiro parâmetro em call e apply.
  8. Recursão aberta function foo () { var bar = function

    () { return this } console.log('foo: this é ' + this) // global console.log('bar: this é ' + bar()) // global }
  9. Recursão aberta var obj = { foo: function () {

    var bar = function () { return this } console.log('foo: this é ' + this) // obj console.log('bar: this é ' + bar()) // ahn? } }
  10. Recursão aberta var obj = { foo: function () {

    var that = this var bar = function () { return that } console.log('foo: this é ' + this) // obj console.log('bar: this é ' + bar()) // obj :) } }
  11. Instanciação function criaAnimal (nome, barulho) { return { nome: nome,

    barulho: barulho } } var pato = criaAnimal('pato', 'quack!') pato.constructor // [Function: Object] function criaAnimal (nome, barulho) { var animal = { } animal.nome = nome animal.barulho = barulho return animal } var pato = criaAnimal('pato', 'quack!') pato.constructor // [Function: Object]
  12. Instanciação // é importante iniciar com letra maiúscula! function Animal

    (nome, barulho) { this.nome = nome this.barulho = barulho } var pato = new Animal('pato', 'quack!') pato.constructor // [Function: Animal] pato instanceof Animal // true
  13. Herança prototípica Herança é utilizar a estrutura e o comportamento

    da superclasse na subclasse. Na herança prototípica não existe distinção entre instância e classe, um objeto qualquer pode ser utilizado como protótipo para criação de outro (objetos estes dividindo um protótipo em comum). Prototípicos são dinâmicos, podemos alterá-los em tempo de execução. Esqueça classes abstratas, sealed, interfaces, etc.
  14. Herança prototípica function Animal (nome, barulho) { this.nome = nome

    this.barulho = barulho } var pato = new Animal('pato', 'quack!') var pato2 = new Animal('pato 2', 'queeeeeeeeeck') 'apresentacao' in pato // false Animal.prototype.apresentacao = function () { console.log('Eu sou ' + this.nome + ' e faço ' + this.barulho) } 'apresentacao' in pato // true pato.hasOwnProperty('apresentacao') // false
  15. Herança prototípica function Animal (nome, barulho) { this.nome = nome

    this.barulho = barulho } Animal.prototype.apresentacao = function () { console.log('Eu sou ' + this.nome + ' e faço ' + this.barulho) } var cao = new Animal('cão', 'auuuu') function Pato (barulho) { Animal.call(this, 'pato', barulho) } Pato.prototype = Object.create(Animal. prototype) Pato.prototype.quack = function () { console.log(this.barulho) } var pato = new Pato('quack!') var pato2 = new Pato('queeeeeeeeeck')
  16. Encapsulamento • Proteger o estado do objeto do mundo exterior.

    • Em JavaScript nosso típico private não existe. “Lots of so called object oriented languages have setters and when you have an setter on an object you turned it back into a data structure.”
  17. Encapsulamento // utilizando prefixos function Circulo (diametro) { // convenciona-se

    que propriedades iniciadas por "_" são privadas // nenhum tratamento especial é feito pela linguagem // funcionam como uma propriedade qualquer this._raio = diametro / 2 }
  18. Encapsulamento // utilizando closures function Circulo (diametro) { // enclausuramos

    o raio apenas a função construtora // e expomos o que for necessário via funções var _raio = diametro / 2 this.setDiametro = function (diametro) { _raio = diametro / 2 } this.getDiametro = function (diametro) { return _raio * 2 } }
  19. Encapsulamento // utilizando getters/setters function Circulo(diametro) { this._raio = diametro

    / 2 } Object.defineProperty( Circulo.prototype, 'diametro', { get: function () { return this._raio * 2 }, set: function(diametro) { this._raio = diametro / 2 } } )
  20. Encapsulamento function Circulo (diametro) { this._raio = diametro / 2

    } Object.defineProperty( Circulo.prototype, 'PI', { value: 3.1415, enumerable: true, writable: false // apesar de a escrita não gerar erro (é ignorada), funciona como uma constante } )
  21. Conclusão JavaScript pegou emprestado conceitos de diversas linguagens de programação.

    A linguagem é dinâmica não só no que diz a respeito a sua sintaxe ou tipagem, mas também em como OO é feito. Não tente fazer OO da forma clássica, entenda bem como JavaScript funciona e arquitete a solução para sua necessidade. E claro, lembre-se de evitar as más partes!
  22. Conclusão JavaScript pegou emprestado conceitos de diversas linguagens de programação.

    A linguagem é dinâmica não só no que diz a respeito a sua sintaxe ou tipagem, mas também em como OO é feito. Não tente fazer OO da forma clássica, entenda bem como JavaScript funciona e arquitete a solução para sua necessidade. E claro, lembre-se de evitar as más partes!