O JavaScript possui um sistema de objetos sem classe no qual os objetos herdam propriedades diretamente de outros objetos. Isso é realmente poderoso, mas não é familiar para programadores treinados classicamente. Se você tentar aplicar padrões clássicos de design diretamente ao JavaScript, ficará frustrado. Mas se você aprender a trabalhar com a natureza prototípica do JavaScript, seus esforços serão recompensados.
...
É Lisp na roupa de C.
O que isso significa para um desenvolvedor de jogos que trabalha com canvas e HTML5? Eu estive examinando essa questão sobre padrões de design úteis nos jogos, mas a herança prototípica é muito diferente da herança clássica, e certamente existem diferenças na melhor maneira de aplicar alguns desses padrões comuns.
Por exemplo, a herança clássica nos permite criar uma moveableEntity
classe, e estender isso com as classes que se movem em nosso mundo de jogo ( player
, monster
, bullet
, etc.). Claro, você pode ativar o JavaScript para funcionar dessa maneira, mas ao fazê-lo, você está meio que lutando contra sua natureza. Existe uma abordagem melhor para esse tipo de problema quando temos herança prototípica na ponta dos dedos?
fonte
Se você realmente se interessar pela semântica, verá que o JavaScript é realmente um pouco mais próximo da maioria das linguagens baseadas em classes do que uma linguagem prototípica "real" como a Self. Da maneira que
new
funciona, você quase sempre cria um objeto que contém estado em seus próprios campos e métodos nos campos de seu protótipo. Aperte os olhos e isso é uma aula.Para ser realmente protótipo, não haveria
new
. Você está clonando objetos e fazendo herança diferencial.Portanto, não se preocupe muito com a natureza semi-prototípica do JavaScript. Apenas entenda três partes:
Na maioria das vezes, seus objetos serão essencialmente instâncias de uma "classe" em que o construtor define seus campos e as funções nos construtores
prototype
definem o método.Se você quiser uma herança única familiar ao estilo Java / C #, poderá obtê-la encadeando protótipos. A maioria das estruturas JS existentes (Closure, dojo etc.) possui alguns métodos auxiliares interessantes para conectá-la.
Você pode adicionar métodos a qualquer "classe" a qualquer momento. Sinta-se à vontade para misturar funções nas quais os protótipos precisam deles. Você nem sempre precisa configurar uma cadeia de herança e uma hierarquia complexa. Se você tiver dez classes que precisam do mesmo método, sempre poderá adicioná-lo imperativamente a essas dez classes.
fonte