先上代码
// 重写Date对象
// 如果是vue或者react项目 在入口文件处写下方代码
window.OldDate = window.Date
var bind = Function.bind
var unbind = bind.bind(bind)
function instantiate (constructor, args) {
return new (unbind(constructor, null).apply(null, args))()
}
window.Date = (function (Date) {
Object.setPrototypeOf(MyDate, Date)
MyDate.prototype = Date.prototype
return MyDate
function MyDate () {
let arg = arguments[0]
if (Object.prototype.toString.call(arg) === '[object String]') {
arguments[0] = arg = arg.replace(/-/g, '/')
arguments[0] = arg.replace(/T/, ' ')
console.log(arguments[0])
}
return instantiate(Date, arguments)
}
}(window.OldDate))
这些代码是在vue-cli中写的, 会有一层babel转换
之前尝试过很多 包括class去继承对象, 直接覆盖原型链(now方法拿不到)
已经开始怀疑人生了, 经过多方查证之后发现
- ES6代码在babel代理之后会与es6原生class的extends出现差异
- 直接覆盖prototype在调用static方法时不会向上查找需要覆盖
__proto__
属性, 但是__proto__
属性已经过时了, 解决的话是使用Object.setPrototypeOf代替直接覆盖原型链的方法
Ps: babel没有办法不用, 所以直接pass掉了