Estoy acostumbrado a usar una class para agrupar funciones y datos comunes dentro de un contenedor central. Sin embargo, con javascript parece que hay varias formas de hacer esto, y al mirar el código, veo que a menudo se usa un enfoque que no es de clase con bastante frecuencia.
Por ejemplo, si tomamos el siguiente código de juguete para hacer algunos cálculos (y permitir el encadenamiento de métodos), aquí hay tres variaciones que a veces puedo ver:
// object approach const MathObject = { num: undefined, setNum(x) {this.num = x; return this;}, square(x) {this.num *= this.num; return this}, print() {console.log(this.num); ; return this}, } let m=Object.create(MathObject); m.setNum(2).square().print() // Response to the comment below -- can uncomment to test // let diff_1 = Object.create(MathObject).setNum(2).square() // let diff_2 = Object.create(MathObject).setNum(5).square() // diff_1.print(), diff_2.print() // let same_1 = MathObject.setNum(2).square() // let same_2 = MathObject.setNum(5).square() // same_1.print(), same_2.print() // function approach function MathFunction() { let num; return { square(x) {this.num *= this.num; return this}, setNum(x) {this.num = x; return this;}, square(x) {this.num *= this.num; return this}, print() {console.log(this.num); ; return this}, } } let a = MathFunction() a.setNum(2).square().print(); // class approach class MathClass { num; constructor(x) {this.num = x; /*ignored for now*/ } setNum(x) {this.num = x; return this} square(x) {this.num *= this.num; return this} print() {console.log(this.num);return this;} } m = new MathClass(); m.setNum(2).square().print()¿Es este un resumen preciso de las formas más comunes en javascript en las que se encapsulan los datos y los métodos? ¿Y hay alguna razón para no usar una clase (aparte de mantener el estilo en un proyecto anterior)?