JavaScript:覆盖Date.prototype.constructor

前端之家收集整理的这篇文章主要介绍了JavaScript:覆盖Date.prototype.constructor前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想改变标准Date对象的行为.在0..99之间传递给构造函数的年份应该被解释为fullYear(不添加1900).但是我的以下功能不起作用
var oDateConst = Date.prototype.constructor; // save old contructor

Date.prototype.constructor = function () {
    var d = oDateConst.apply(oDateConst,arguments); // create object with it
    if ( ((arguments.length == 3) || (arguments.length == 6))
        && ((arguments[0] < 100) && (arguments[0] >= 0))) {
        d.setFullYear(arguments[0]);
    }
    return d;
}

为什么它永远不会被呼叫?你如何解决这个问题?

解决方法

它永远不会被调用的原因是因为您正在更改Date.prototype上的构造函数属性.但是您可能仍然使用代码New Date()创建日期.所以它永远不会使用你的构造函数.你真正想做的是创建自己的Date构造函数
function MyDate() {
    var d = Date.apply(Date,arguments);
    if ((arguments.length == 3 || arguments.length == 6)
        && (arguments[0] < 100 && arguments[0] >= 0)) {
        d.setFullYear(arguments[0]);
    return d;
}

那么你可以创建这样的新日期:

var d = MyDate();

编辑:而不是使用Date.apply我宁愿使用以下的实例化函数,它允许你apply arguments to a constructor function

var bind = Function.bind;
var unbind = bind.bind(bind);

function instantiate(constructor,args) {
    return new (unbind(constructor,null).apply(null,args));
}

这是我如何实现新的date构造函数

function myDate() {
    var date = instantiate(Date,arguments);
    var args = arguments.length;
    var arg = arguments[0];

    if ((args === 3 || args == 6) && arg < 100 && arg >= 0)
        date.setFullYear(arg);
    return date;
}

编辑:如果要覆盖本机Date构造函数,那么您必须执行以下操作:

Date = function (Date) {
    MyDate.prototype = Date.prototype;

    return MyDate;

    function MyDate() {
        var date = instantiate(Date,arguments);
        var args = arguments.length;
        var arg = arguments[0];

        if ((args === 3 || args == 6) && arg < 100 && arg >= 0)
            date.setFullYear(arg);
        return date;
    }
}(Date);

猜你在找的JavaScript相关文章