Considere que tenemos fragmentos de seguimiento:
function Counter() { let count = 0 function inc() { count += 1 } function dec() { count -= 1 } function getCount() { return count } return { getCount, inc, dec, count } } const counter = Counter() counter.inc() counter.inc() console.log(counter.getCount()) // 2 console.log(counter.count) // 0 Me pregunto por qué usar la función getCount() y devolver directamente la variable de count muestra un resultado diferente. En mi opinión, ambos hacen referencia a la misma dirección de count , y después de que inc() llame, su valor debe modificarse en consecuencia.
return { getCount, inc, dec, count } :
Cuando cambia el valor de la variable de count , no cambia el valor de la propiedad de count .
La razón es porque cuando hace counter.count , está obteniendo el valor de conteo del nuevo objeto que devolvió. Ese recuento es en realidad una copia del valor en el momento en que se creó y nunca se actualizará.
Si, en cambio, crea una clase y usa this.count en su lugar, siempre se actualizará.
class Counter { constructor() { this.count = 0; } inc() { this.count += 1; } dec() { this.count -= 1; } getCount() { return this.count; } } const counter = new Counter(); counter.inc() counter.inc() console.log(counter.getCount()) // 2 console.log(counter.count) // 2O, si quieres hacerlo de la manera más antigua:
function Counter() { this.count = 0 function inc() { count += 1 } function dec() { count -= 1 } function getCount() { return count } this.inc = inc; this.dec = dec; this.getCount = getCount; return this; } const counter = Counter() counter.inc() counter.inc() console.log(counter.getCount()) // 2 console.log(counter.count) // 2 O bien, podría count y objetar con algún valor que se actualizaría:
function Counter() { let count = { value: 0 } function inc() { count.value += 1 } function dec() { count.value -= 1 } function getCount() { return count.value } return { getCount, inc, dec, count } } const counter = Counter() counter.inc() counter.inc() console.log(counter.getCount()) // 2 console.log(counter.count.value) // 2Aunque ese último es un poco tonto para este caso de uso en particular.