扩展javascript本机对象

时间:2017-06-21 08:52:42

标签: javascript constructor prototype

您好我想知道如何扩展像Date这样的构造函数, 问题是我有一个庞大的,非常大的应用程序,我想知道每次Date对象的实例化。基本上我想在构造函数中打印一些东西。我不想定义一个新的construtor,我将在其中调用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.

我不明白为什么它不起作用,任何帮助都将不胜感激

1 个答案:

答案 0 :(得分:0)

最简单的解决方案可能是:



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




上面的代码虽然不够好。如果您尝试将警报添加到构造函数中,您会发现它在当前环境中被多次调用,但它将在真实环境中工作:



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