我试图修补javascript Date
构造函数。
我有以下代码:
var __Date = window.Date;
window.Date = function(){
__Date.apply(this, Array.prototype.slice.call(arguments));
};
window.Date.prototype = __Date.prototype;
据我所知,javascript构造函数(被调用时)做了三件事:
this
指向执行构造函数时 Ad.1是通过调用新Date
函数的方式自动完成的(new Date()
)
Ad.2如果通过将我的新Date.prototype
设置为原始Date.prototype
来完成。
Ad.3是通过在新创建的对象的上下文中调用原始Date
函数来完成的,该函数具有相同的参数,这些参数将传递给" my" Date
功能。
不知怎的,它不起作用。当我打电话给new Date().getTime()
我收到错误消息TypeError: this is not a Date object.
为什么它不起作用?甚至这段代码:
new Date() instanceof __Date
返回true
所以通过设置相同的原型我欺骗了instanceof
运算符。
PS。这一点的重点在于我想检查传递给Date
构造函数的参数,并在满足某个条件时更改它们。
答案 0 :(得分:0)
感谢@elclanrs提供的链接,我提出了一个可行的解决方案:
var __Date = window.Date;
window.Date = function f(){
var args = Array.prototype.slice.call(arguments);
// Date constructor monkey-patch to support date parsing from strings like
// yyyy-mm-dd hh:mm:ss.mmm
// yyyy-mm-dd hh:mm:ss
// yyyy-mm-dd
if(typeof args[0] === "string" && /^\d{4}-\d{2}-\d{2}( \d{2}:\d{2}:\d{2}(\.\d{3})?)?$/.test(args[0])){
args[0] = args[0].replace(/-/g, '/').replace(/\.\d{3}$/, '');
}
args.unshift(window);
if(this instanceof f)
return new (Function.prototype.bind.apply(__Date, args));
else
return __Date.apply(window, args);
};
// define original Date's static properties parse and UTC and the prototype
window.Date.parse = __Date.parse;
window.Date.UTC = __Date.UTC;
window.Date.prototype = __Date.prototype;
问题仍然存在:为什么我的第一次尝试没有效果?