Javascript Date对象

前言

任何语言的Date类型都有自己的一套实现方法,JS中内置引用类型Date类型,特点很多,可以做一个记录。

继承Date

参考这个

//参考实现

// 需要考虑polyfill情况
    Object.setPrototypeOf = Object.setPrototypeOf ||
        function (obj, proto) {
            obj.__proto__ = proto;

            return obj;
        };

    /**
     * 用了点技巧的继承,实际上返回的是Date对象
     */
    function MyDate() {
        // bind属于Function.prototype,接收的参数是:object, param1, params2...
        var dateInst = new (Function.prototype.bind.apply(Date, [Date].concat(Array.prototype.slice.call(arguments))))();

        // 更改原型指向,否则无法调用MyDate原型上的方法
        // ES6方案中,这里就是[[prototype]]这个隐式原型对象,在没有标准以前就是__proto__
        Object.setPrototypeOf(dateInst, MyDate.prototype);

        dateInst.abc = 1;

        return dateInst;
    }

    // 原型重新指回Date,否则根本无法算是继承
    Object.setPrototypeOf(MyDate.prototype, Date.prototype);

    MyDate.prototype.format = function () { //箭头函数在操作this,arguments和new时,避免使用
        let y = this.getFullYear(),
            mon = this.getMonth() + 1,
            d = this.getDate(),
            h = this.getHours(),
            min = this.getMinutes(),
            s = this.getSeconds();
        mon = mon > 9 ? mon : '0' + mon;
        d = d > 9 ? d : '0' + d;
        h = h > 9 ? h : '0' + h;
        min = min > 9 ? min : '0' + min;
        s = s > 9 ? s : '0' + s;
        return y + '-' + mon + '-' + d + ' ' + h + ':' + min + ':' + s;
    }

    let date = new MyDate(1995, 11, 17, 3, 24, 0);
    console.log(date.format()); // 1995-12-17 03:24:00

ES6不经过Babel打包的继承:

class MyDate extends Date {
    constructor() {
        super();
        this.abc = 1;
    }
    getTest() {
        return this.getTime();
    }
}

let date = new MyDate();

// 正常输出,譬如1515638988725
console.log(date.getTest());

ES6继承类似Date类型的方法和ES5黑魔法继承的方式一样,只不过前者是在底层实现的,后者容易引起性能问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值