Prefiro usar o OOP em projetos de grande escala como o que estou trabalhando no momento. Preciso criar várias classes em JavaScript, mas, se não me engano, há pelo menos algumas maneiras de fazer isso. Qual seria a sintaxe e por que isso seria feito dessa maneira?
Eu gostaria de evitar o uso de bibliotecas de terceiros - pelo menos a princípio.
Procurando outras respostas, encontrei o artigo Programação Orientada a Objetos com JavaScript, Parte I: Herança - Doc JavaScript que discute a programação orientada a objetos em JavaScript. Existe uma maneira melhor de fazer herança?
javascript
oop
class
Karim
fonte
fonte
Respostas:
Aqui está a maneira de fazer isso sem usar nenhuma biblioteca externa:
Agora, a resposta real é muito mais complexa do que isso. Por exemplo, não existem classes em JavaScript. JavaScript usa um
prototype
esquema de herança baseado em.Além disso, existem inúmeras bibliotecas JavaScript populares que têm seu próprio estilo de aproximação da funcionalidade de classe no JavaScript. Você deve conferir pelo menos o Prototype e o jQuery .
Decidir qual desses é o "melhor" é uma ótima maneira de iniciar uma guerra santa no Stack Overflow. Se você está embarcando em um projeto maior com JavaScript, definitivamente vale a pena aprender uma biblioteca popular e fazê-lo da maneira deles. Eu sou um cara do protótipo, mas o Stack Overflow parece inclinar-se para o jQuery.
Na medida em que existe apenas "uma maneira de fazê-lo", sem nenhuma dependência de bibliotecas externas, a maneira como escrevi é praticamente isso.
fonte
A melhor maneira de definir uma classe em JavaScript é não definir uma classe.
A sério.
Existem vários tipos diferentes de orientação a objetos, alguns deles são:
E provavelmente outros que eu não conheço.
JavaScript implementa OO baseado em protótipo. No OO baseado em protótipo, novos objetos são criados copiando outros objetos (em vez de serem instanciados a partir de um modelo de classe) e os métodos vivem diretamente nos objetos, e não nas classes. A herança é feita via delegação: se um objeto não possui um método ou propriedade, ele é procurado em seu (s) protótipo (s) (ou seja, o objeto do qual foi clonado), depois nos protótipos do protótipo e assim por diante.
Em outras palavras: não há classes.
Na verdade, o JavaScript tem um belo ajuste nesse modelo: construtores. Não apenas você pode criar objetos copiando os existentes, mas também construí-los "do nada", por assim dizer. Se você chamar uma função com a
new
palavra - chave, essa função se tornará um construtor e athis
palavra - chave não apontará para o objeto atual, mas para um objeto "vazio" recém-criado. Portanto, você pode configurar um objeto da maneira que desejar. Dessa forma, os construtores JavaScript podem assumir um dos papéis das classes no OO tradicional baseado em classes: servindo como modelo ou blueprint para novos objetos.Agora, o JavaScript é uma linguagem muito poderosa, por isso é muito fácil implementar um sistema OO baseado em classe no JavaScript, se você desejar. No entanto, você só deve fazer isso se realmente precisar, e não apenas porque é assim que o Java faz.
fonte
Classes ES2015
Na especificação do ES2015, você pode usar a sintaxe da classe que é apenas açúcar no sistema de protótipo.
Benefícios
O principal benefício é que as ferramentas de análise estática acham mais fácil direcionar essa sintaxe. Também é mais fácil para outras pessoas provenientes de idiomas baseados em classe usarem o idioma como poliglota.
Ressalvas
Desconfie de suas limitações atuais. Para obter propriedades particulares, é preciso recorrer ao uso de Symbols ou WeakMaps . Em versões futuras, as classes provavelmente serão expandidas para incluir esses recursos ausentes.
Apoio, suporte
O suporte ao navegador não é muito bom no momento (suportado por quase todos, exceto o IE), mas você pode usar esses recursos agora com um transpiler como o Babel .
Recursos
fonte
Eu prefiro usar o Daniel X. Moore
{SUPER: SYSTEM}
. Esta é uma disciplina que fornece benefícios como variáveis de instância verdadeiras, herança baseada em características, hierarquias de classes e opções de configuração. O exemplo abaixo ilustra o uso de variáveis de instância verdadeiras, que acredito serem a maior vantagem. Se você não precisar de variáveis de instância e estiver satisfeito apenas com variáveis públicas ou privadas, provavelmente haverá sistemas mais simples.Uau, isso não é realmente muito útil por si só, mas dê uma olhada em adicionar uma subclasse:
Outra vantagem é a capacidade de ter módulos e herança baseada em características.
Um exemplo de como a classe person inclui o módulo vinculável.
Divulgação: Eu sou Daniel X. Moore e este é o meu
{SUPER: SYSTEM}
. É a melhor maneira de definir uma classe em JavaScript.fonte
fonte
A seguir estão as maneiras de criar objetos em javascript, que eu usei até agora
Exemplo 1:
Exemplo 2:
Exemplo 3:
Exemplo 4: Benefícios reais de Object.create (). por favor consulte [este link]
Exemplo 5 (Object.create personalizado de Crockford):
Para manter a resposta atualizada com o ES6 / ES2015
Uma classe é definida assim:
fonte
Eu acho que você deveria ler a Herança Prototípica de Douglas Crockford em JavaScript e a Herança Clássica em JavaScript .
Exemplos de sua página:
Efeito? Isso permitirá que você adicione métodos de maneira mais elegante:
Eu também recomendo os vídeos dele: JavaScript avançado .
Você pode encontrar mais vídeos em sua página: http://javascript.crockford.com/ No livro de John Reisig, você pode encontrar muitos exemplos no site de Douglas Crockfor.
fonte
'strings'
como nomes de muitas coisas, mas elegante, não é um deles ...Como não vou admitir o plano da fábrica da YUI / Crockford e porque gosto de manter as coisas independentes e extensíveis, esta é a minha variação:
onde idealmente o teste typeof é sobre algo como o primeiro método prototipado
fonte
Se você é simples, pode evitar completamente a palavra-chave "nova" e apenas usar métodos de fábrica. Às vezes prefiro isso porque gosto de usar JSON para criar objetos.
Não sei ao certo qual é o impacto no desempenho para objetos grandes.
fonte
É assim que o TypeScript compila a classe com o construtor para JavaScript.
fonte
A maneira mais simples é:
O motivo
that
é que issothis
pode ser vinculado a outra coisa se você fornecer um método como manipulador de eventos, para salvar o valor durante a instanciação e usá-lo mais tarde.Edit: definitivamente não é a melhor maneira, apenas uma maneira simples. Também estou esperando por boas respostas!
fonte
Você provavelmente deseja criar um tipo usando o padrão de dobramento:
Esse código fornecerá um tipo chamado myType . Terá campos privados internos chamados de alternância e texto . Ele também terá esses membros expostos: os campos contam e números ; as propriedades de alternância , texto e numberLength ; os métodos incrementNumbersByCount e tweak .
O padrão de dobragem é totalmente detalhado aqui: Javascript Folding Pattern
fonte
Código de golfe para a resposta de @ liammclennan .
fonte
O MooTools (Minhas Ferramentas Orientadas a Objetos) está centrado na idéia de classes . Você pode até estender e implementar com herança.
Quando dominado, cria um javascript poderoso e ridiculamente reutilizável.
fonte
Classes baseadas em objeto com herança
Simples, doce e pronto.
fonte
Humilhar
Uma aula
Açao
fonte
Com base no exemplo do Triptych, isso pode ser ainda mais simples:
Isso cria apenas uma instância de objeto único, mas ainda é útil se você desejar encapsular vários nomes de variáveis e métodos em uma classe. Normalmente, não haveria os argumentos "Bob, M" para o construtor, por exemplo, se os métodos fossem chamadas para um sistema com seus próprios dados, como um banco de dados ou rede.
Ainda sou muito novo com JS para ver por que isso não usa a
prototype
coisa.fonte
O JavaScript é orientado a objetos , mas é radicalmente diferente de outras linguagens OOP , como Java, C # ou C ++. Não tente entender assim. Jogue fora esse conhecimento antigo e comece de novo. JavaScript precisa de um pensamento diferente.
Sugiro obter um bom manual ou algo sobre o assunto.
Eu mesmo achei os tutoriais do ExtJS o melhor para mim, embora não tenha usado o framework antes ou depois de lê-lo. Mas dá uma boa explicação sobre o que é o que no mundo JavaScript.Desculpe, parece que esse conteúdo foi removido. Aqui está um link para a cópia archive.org . Trabalha hoje. : Pfonte
fonte