gpt4 book ai didi

JavaScript:覆盖 Date.prototype.constructor

转载 作者:可可西里 更新时间:2023-11-01 02:29:19 25 4
gpt4 key购买 nike

我想更改标准日期对象的行为。传递给构造函数的 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.prototypeconstructor 属性。但是,您可能仍在使用代码 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,不如使用下面的instantiate 函数,它允许您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));
}

这就是我实现新日期构造函数的方式:

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;
}

编辑:如果您想覆盖 native 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:覆盖 Date.prototype.constructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13839318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com