He estado pensando bastante sobre cómo hacer OOP en JS, especialmente cuando se trata de encapsulación y herencia, recientemente.
Según Crockford, el clásico es dañino debido a new (), y tanto el prototipo como el clásico están limitados porque su uso de constructor.prototype significa que no puede usar cierres para la encapsulación.
Recientemente, he considerado los siguientes dos puntos sobre la encapsulación:
La encapsulación mata el rendimiento . Le hace agregar funciones a CADA objeto miembro en lugar de al prototipo, porque los métodos de cada objeto tienen cierres diferentes (cada objeto tiene miembros privados diferentes).
La encapsulación obliga a la desagradable solución "var that = this" a obtener funciones auxiliares privadas para tener acceso a la instancia a la que están conectadas. O eso, o asegúrese de llamarlos con privateFunction.apply (this) cada vez.
¿Hay soluciones para cualquiera de los dos problemas que mencioné? si no, ¿todavía considera que la encapsulación vale la pena?
Nota al margen: El patrón funcional que describe Crockford ni siquiera le permite agregar métodos públicos que solo toquen a los miembros públicos, ya que renuncia por completo al uso de new () y constructor.prototype. ¿No sería superior un enfoque híbrido en el que usa la herencia clásica y new (), pero también llama a Super.apply (esto, argumentos) para inicializar miembros privados y métodos privilegiados?
O(1)
a O(n)
con n = 2
...