前言
任何语言的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黑魔法继承的方式一样,只不过前者是在底层实现的,后者容易引起性能问题。