É uma velha pergunta e desculpas pela autopromoção sem vergonha pois essa não é a minha intenção, só espero que ajude alguém.
Além do que diz razorbeard ( .clone()etc), criei um módulo NPM que anexa métodos imutáveis a tudo o que o Moment.js vem pronto para uso. A intenção não é quebrar o código existente, então o módulo adiciona novos métodos com Immuanexado ao seu nome.
Cada instância retornada pela fábrica de momento será decorada com métodos imutáveis, por exemplo moment().startOf(), terá correspondente startOfImmu(), add()terá addImmu()etc. Cada um desses retorna um novo momento ao invés de modificar um existente. Para usá-lo, basta passar de momentfábrica momentImmutableMethodspara obter acesso a novos métodos imutáveis. Exemplo:
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á no NPM em https://www.npmjs.com/package/moment-immutable-methods