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) // 2
O, 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) // 2
Aunque ese último es un poco tonto para este caso de uso en particular.