Ber*_*ber 11 javascript constructor prototype date
我想改变标准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;
}
Run Code Online (Sandbox Code Playgroud)
它为什么永远不会被召唤?你会如何解决这个问题?
Aad*_*hah 32
永远不会被调用的原因是因为您正在更改constructor属性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;
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样创建你的新日期:
var d = MyDate();
Run Code Online (Sandbox Code Playgroud)
编辑:而不是使用Date.apply我宁愿使用以下instantiate函数,它允许您将参数应用于构造函数:
var bind = Function.bind;
var unbind = bind.bind(bind);
function instantiate(constructor, args) {
return new (unbind(constructor, null).apply(null, args));
}
Run Code Online (Sandbox Code Playgroud)
这是我实现新日期构造函数的方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:如果要覆盖本机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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11017 次 |
| 最近记录: |