javascript - ¿Cómo puedo evitar la mutabilidad en moment.js?
object immutability (2)
Es una vieja pregunta y me disculpo por la autopromoción desvergonzada ya que esta no es mi intención, solo espero que ayude a alguien.
Además de lo que dice razorbeard ( .clone()
etc.), creé un módulo de NPM que vincula métodos inmutables a lo que Moment.js viene de fábrica. La intención no es romper el código existente para que el módulo agregue nuevos métodos con Immu
anexado a su nombre.
Cada instancia devuelta por fábrica de momento estará decorada con métodos inmutables, por ejemplo, moment().startOf()
tendrá startOfImmu()
, add()
tendrá addImmu()
etc. Cada uno de ellos devuelve un nuevo momento en lugar de modificar uno existente. Para usarlo, pase el moment
factory to momentImmutableMethods
para tener acceso a nuevos métodos inmutables. Ejemplo:
var moment = require(''moment''); // or moment-timezone
import { momentImmutableMethods } from ''moment-immutable-methods'';
// to decorate instances with immutable methods we need to extend moment factory as below:
momentImmutableMethods(moment);
// now every instance returned by moment will have Immu methods attached.
// IMMUTABLE EXAMPLE
// we using immutable methods that were attached to every instance, these have Immu appended to original name
const ddd = moment({
hour: 5,
minute: 10
});
// Moment {_isAMomentObject: true, _i: {…}, _isUTC: false, _pf: {…}, _locale: Locale, …}
const eee = ddd.startOfImmu(''day'');
// Moment {_isAMomentObject: true, _i: {…}, _isUTC: false, _pf: {…}, _locale: Locale, …}
console.log(ddd === eee);
// false
const fff = eee.startOfImmu(''month'');
// Moment {_isAMomentObject: true, _i: {…}, _isUTC: false, _pf: {…}, _locale: Locale, …}
console.log(ddd === fff);
// false
console.log(eee === fff);
// false
console.log(ddd.format(''DD/MM/YY HH:mma''));
// "14/04/18 05:10am"
console.log(eee.format(''DD/MM/YY HH:mma''));
// "14/04/18 00:00am"
console.log(fff.format(''DD/MM/YY HH:mma''));
// "08/04/18 00:00am"
Está en NPM en https://www.npmjs.com/package/moment-immutable-methods
Me he encontrado con un problema donde tengo que almacenar los valores iniciales de un objeto de un momento, pero estoy teniendo problemas para evitar que mi variable cambie junto con el objeto original.
Desafortunadamente Object.freeze () no funciona, porque moment.js devuelve un error de "fecha no válida" cuando trato de formatear eso.
Hay un complemento de Moment.js en NPM llamado frozen-moment . Puedes usar moment().freeze()
Object.freeze(moment())
moment().freeze()
en lugar de Object.freeze(moment())
.
De lo contrario, vainilla Moment.js tiene un método de clone
que debería ayudarte a evitar problemas de mutabilidad, por lo que podrías hacer algo como esto:
var a = moment(),
b = a.clone(); // or moment(a)
ACTUALIZAR:
Han pasado dos años desde que escribí esta respuesta. En este momento, otra biblioteca para trabajar con fechas ha surgido y ganó mucha tracción: https://date-fns.org/
Esta biblioteca es inmutable de forma predeterminada y sigue una arquitectura modular y funcional, lo que significa que es más adecuada para sacudidas de árboles y agrupaciones del lado del cliente. Si está trabajando en un proyecto que hace un uso extenso de Webpack en el lado del cliente, y descubre que Moment.js le está dando problemas con su compilación, o incluso si la mutabilidad de Moment.js le está causando muchos dolores de cabeza, entonces usted debería darle una oportunidad a date-fns
.