Dado que su problema es principalmente estilístico (no quiere llenar el constructor con un montón de declaraciones), también se puede resolver estilísticamente.
A mi modo de ver, muchos lenguajes basados en clases tienen el constructor como una función nombrada después del nombre de la clase. Estilísticamente podríamos usar eso para hacer una clase ES6 que estilísticamente todavía tiene sentido pero no agrupa las acciones típicas que tienen lugar en el constructor con todas las declaraciones de propiedades que estamos haciendo. Simplemente usamos el constructor JS real como el "área de declaración", luego hacemos una función llamada clase que de otro modo tratamos como el área "otras cosas del constructor", llamándola al final del verdadero constructor.
"uso estricto";
clase MyClass
{
// solo declara tus propiedades y luego llama a esto. ClassName (); de aquí
constructor(){
this.prop1 = 'bla 1';
this.prop2 = 'blah 2';
this.prop3 = 'blah 3';
this.MyClass ();
}
// todo tipo de otras cosas de "constructor", que ya no están mezcladas con declaraciones
Mi clase() {
Haz lo que sea();
}
}
Ambos serán llamados a medida que se construya la nueva instancia.
Es como tener 2 constructores donde separa las declaraciones y las otras acciones de constructor que desea realizar, y estilísticamente hace que no sea demasiado difícil entender que eso también está sucediendo.
Creo que es un buen estilo para usar cuando se trata de muchas declaraciones y / o muchas acciones que deben ocurrir en la instanciación y que desean mantener las dos ideas distintas entre sí.
NOTA : no uso las ideas idiomáticas típicas de "inicialización" (como un método init()
o initialize()
) porque a menudo se usan de manera diferente. Hay una especie de presunta diferencia entre la idea de construir e inicializar. Al trabajar con constructores, las personas saben que se les llama automáticamente como parte de la creación de instancias. Al ver un init
método, muchas personas van a suponer, sin una segunda mirada, que necesitan hacer algo a lo largo de la forma var mc = MyClass(); mc.init();
, porque así es como normalmente se inicializa. No estoy tratando de agregar un proceso de inicialización para el usuario de la clase, estoy tratando de agregar al proceso de construcción de la clase en sí.
Si bien algunas personas pueden hacer una doble toma por un momento, ese es realmente el punto: les comunica que la intención es parte de la construcción, incluso si eso les hace hacer una pequeña toma doble y decir "eso no es cómo funcionan los constructores de ES6 "y toman un segundo vistazo al constructor real para decir" oh, lo llaman en la parte inferior, ya veo ", eso es mucho mejor que NO comunicar esa intención (o comunicarla incorrectamente) y probablemente obtener mucha información personas que lo usan mal, tratando de inicializarlo desde afuera y basura. Eso es muy intencional al patrón que sugiero.
Para aquellos que no quieren seguir ese patrón, todo lo contrario también puede funcionar. Agrupe las declaraciones a otra función al principio. Quizás lo denomine "propiedades" o "publicProperties" o algo así. Luego pon el resto de las cosas en el constructor normal.
"uso estricto";
clase MyClass
{
propiedades () {
this.prop1 = 'bla 1';
this.prop2 = 'blah 2';
this.prop3 = 'blah 3';
}
constructor () {
this.properties ();
Haz lo que sea();
}
}
Tenga en cuenta que este segundo método puede parecer más limpio, pero también tiene un problema inherente en el que properties
se anula cuando una clase que usa este método extiende a otra. Tendría que dar más nombres únicos properties
para evitar eso. Mi primer método no tiene este problema porque su mitad falsa del constructor lleva el nombre exclusivo de la clase.
this.member = member
en su constructor con 20-30 parámetros?