扩展 JavaScript 本机对象



你好,我想知道如何扩展像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);

相关内容

最新更新