objetos de JavaScript y The Good Parts de Crockford

8

He estado pensando bastante acerca de cómo hacer la POO en JS, especialmente cuando se trata de encapsulación y herencia, recientemente.

Según Crockford, lo clásico es perjudicial debido a new (), y tanto el prototipo como el clásico están limitados porque su uso de protector.prototipo significa que no se pueden usar cierres para la encapsulación.

Recientemente, he considerado los siguientes puntos sobre la encapsulación:

  1. Encapsulación mata el rendimiento . Te hace agregar funciones a CADA objeto miembro en lugar de al prototipo, porque los métodos de cada objeto tienen diferentes cierres (cada objeto tiene diferentes miembros privados).

  2. La encapsulación obliga a la fea solución "var that = this" para que las funciones de ayuda privadas tengan acceso a la instancia a la que están vinculadas. O eso o asegúrese de llamarlos con privateFunction.apply (this) cada vez.

¿Hay soluciones para alguno de los dos problemas que mencioné? si no, ¿sigue considerando que la encapsulación vale la pena?

Sidenote: El patrón funcional que Crockford describe ni siquiera le permite agregar métodos públicos que solo tocan a los miembros públicos, ya que renuncia completamente al uso de new () y constructor.prototype. ¿Un enfoque híbrido en el que utilizaría la herencia clásica y new (), pero también llamaría Super.apply (esto, argumentos) para inicializar los miembros privados y los métodos privilegiados, sería superior?

    
pregunta Jonathan 01.11.2012 - 12:25

1 respuesta

2

La encapsulación es realmente difícil, y probablemente no valga la pena el esfuerzo en JavaScript. Un método que funcione y que haga todo lo que desee (campos privados, acceso a la superclase y métodos privados) sería esta solución (probablemente muy fea y mejorable):

function SomeClass() {

    var parent = SomeSuperClass(),
        somePrivateVar;

    return Object.create(parent, {
        somePrivateVar: {
            get: function() {
                return somePrivateVar;
            },
            set: function(value) {
                somePrivateVar = value;
            }
        },
        doSomething: {
            value: function(data) {
                someHelperFunction.call(this, data);
            }
        }
    });
}

function someHelperFunction(data) {
    this.someMethod(data);
}

Este tipo de trabajos, le permite tener campos y métodos privados y la herencia como uno lo esperaría. Sin embargo, no me gusta, pero me gusta la mejor de todas las posibilidades que tiene en JavaScript puro.

Si tuviera que comenzar un nuevo proyecto con una gran cantidad de JavaScript, probablemente echaría un vistazo más de cerca a TypeScript . Mejora JavaScript cuando es necesario (IMHO), le proporciona tipificación estática, herencia, encapsulación y todo. Pero, después de todo, solo es JavaScript.

Ahora, ¿vale la pena? Creo que hay dos cosas importantes a considerar. La encapsulación probablemente lo ayude en el tiempo de desarrollo, pero ciertamente no en el tiempo de ejecución. Creo que tienes que decidir; O bien no hay encapsulación y mejor rendimiento, o encapsulación, código no tan hermoso, probablemente un mejor diseño pero algo de sobrecarga en el tiempo de ejecución.

    
respondido por el Bruno Schäpper 01.11.2012 - 14:25

Lea otras preguntas en las etiquetas