我想改变标准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);