javascript - 如何扩展 moment js?

标签 javascript ecmascript-6 momentjs

我想扩展 moment.js,以覆盖它的 toJSON 函数。

const moment = require('moment');

class m2 extends moment {
    constructor(data) {
        super(data);
        this.toJSON = function () {
            return 'STR';
        };
    }
}

const json = {
    date: moment(),
};

const json2 = {
    date: new m2(),
};

console.log(JSON.stringify(json)); // {"date":"2017-07-25T13:36:47.023Z"}
console.log(JSON.stringify(json2)); // {"date":"STR"}

我的问题是,在这种情况下,如果没有 new,我无法调用 m2():

const json3 = {
    date: m2(), // TypeError: Class constructor m2 cannot be invoked without 'new'
};

如何在不使用 new 关键字的情况下扩展 moment 并保持调用它的能力?

重写 moment.prototype.toJSON 不是一个选项,因为我想在代码的其他地方使用默认的 moment 对象。

最佳答案

您是否需要扩展 moment 类?您可以设置替换工厂函数中的 toJSON 函数。

function m2(data) {
    const original = moment(data);
    original.toJSON = function() {
        return 'STR';
    }
    return original;
}

然后像平常一样使用它 moment

const json2 = {
    date: m2(),
};

关于javascript - 如何扩展 moment js?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45305189/

相关文章:

javascript - 使用 setTimeout : "in the blink of an eye" 循环 css 样式

javascript - 如何将 RUN 操作绑定(bind)到 Cloud9 中正确的 NodeJS 版本?

javascript - 使用 Jest 测试 node-cron 作业功能

javascript - jQuery 倒数计时器未显示在浏览器中

javascript - 没有 iframe 的 Backbone 沙箱

Javascript - React - 箭头函数用法理解

javascript - 检查时间是否大于一天中的特定时间

javascript - 如何使用 moment.js 减去一个月?

javascript - 将日期转换为时刻一个字符

javascript - Sequelize 钩子(Hook)触发但不更改对象