你好,我想知道如何扩展像Date这样的构造函数,问题是我有一个非常大的应用程序,我想知道每次实例化 Date 对象。基本上我想在构造函数中打印一些东西。我不想定义一个新的构造器,我会在其中调用 Date((,然后在整个代码中用新的构造函数替换 Date。我真的很想延长日期。我想出了这个:
var previousPrototype = Date.prototype;
Date = function() {
previousPrototype.constructor.call(this);
console.log('new Date instanciation');
}
Date.prototype = previousPrototype;
var extendedDate = new Date(); // prints 'new Date instanciation'
这似乎不错,但是例如,当我这样做时extendedDate.getTime()
我会收到甜蜜的信息
VM103:1 Uncaught TypeError: this is not a Date object.
我不明白为什么它不起作用,任何帮助将不胜感激
最简单的解决方案可能是这样的:
var previousDate = Date;
Date = function () {
console.log(1);
return new previousDate();
};
var extendedDate = new Date();
console.log(extendedDate.getTime());
您的函数 nether 使用关键字 this
也不返回任何对象。您应该首先初始化 Date 对象并将其存储为变量。在函数结束时,应返回对象。
示例程序如下:
var previousDate = Date;
Date = function() {
var newDate = new previousDate();
newDate.newproperty = true;
return newDate;
}
// Date.prototype = previousPrototype;
var extendedDate = new Date();
console.log(extendedDate.getTime());
console.log(extendedDate.newproperty);
上面的代码还不够好。如果您尝试将 alert 添加到构造函数中,您会发现它在当前环境中被多次调用,但它在实际环境中可以工作:
var previousDate = Date;
Date = function() {
var newDate = new previousDate();
newDate.newproperty = true;
alert("Called!");
return newDate;
}
// Date.prototype = previousPrototype;
var extendedDate = new Date();
console.log(extendedDate.getTime());
console.log(extendedDate.newproperty);