日期构造函数猴子补丁

时间:2014-03-14 08:53:06

标签: javascript constructor monkeypatching

我试图修补javascript Date构造函数。 我有以下代码:

var __Date = window.Date;
window.Date = function(){
    __Date.apply(this, Array.prototype.slice.call(arguments));
};
window.Date.prototype = __Date.prototype;

据我所知,javascript构造函数(被调用时)做了三件事:

  1. 它创建一个新对象,this指向执行构造函数时
  2. 它将此对象设置为委托给此构造函数的原型。
  3. 它在这个新创建的对象的上下文中执行构造函数。
  4. 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构造函数的参数,并在满足某个条件时更改它们。

1 个答案:

答案 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;

问题仍然存在:为什么我的第一次尝试没有效果?