Eu tenho pensado bastante sobre como fazer OOP em JS, especialmente quando se trata de encapsulamento e herança, recentemente.
De acordo com Crockford, o clássico é prejudicial por causa de new (), e os protótipos e os clássicos são limitados porque o uso de constructor.prototype significa que você não pode usar tampas para encapsulamento.
Recentemente, considerei os seguintes pontos sobre o encapsulamento:
O encapsulamento mata o desempenho . Isso faz você adicionar funções ao objeto membro EACH, e não ao protótipo, porque os métodos de cada objeto têm fechamentos diferentes (cada objeto possui membros particulares diferentes).
O encapsulamento força a solução alternativa feia "var that = this", para que as funções auxiliares privadas tenham acesso à instância à qual estão conectadas. Ou isso ou certifique-se de chamá-los com privateFunction.apply (this) toda vez.
Existem soluções alternativas para um dos dois problemas que mencionei? caso contrário, você ainda considera o encapsulamento valer a pena?
Nota: O padrão funcional que Crockford descreve nem permite adicionar métodos públicos que apenas tocam em membros públicos, pois renuncia completamente ao uso de new () e constructor.prototype. Uma abordagem híbrida em que você usa herança clássica e new (), mas também chama Super.apply (this, argument) para inicializar membros privados e métodos privilegiados, seria superior?
O(1)
a O(n)
com n = 2
...