未捕获的TypeError:在向Date原型添加函数时,这不是Date对象

时间:2015-12-31 15:45:27

标签: javascript prototype

我在google chrome和firefox中遇到此代码的问题。 this.setUTCDate(1);抛出Uncaught TypeError:这不是Date对象。我该如何解决?

我看过thisthis,但我找不到任何可以解决问题的方法。

Date.prototype.setUTCDateOnly = function(date) {
    var tmp = new Date(date);
    this.setUTCDate(1);
};

我这样称呼它:

var date = Date.prototype.setUTCDateOnly(item.date);

2 个答案:

答案 0 :(得分:3)

添加到构造函数的.prototype的方法旨在对从该构造函数创建的实例进行操作。相反,您正在对.prototype对象本身进行操作。

为什么呢?因为您的案例中this的值是通过查看.运算符的左侧来设置的。换句话说,调用方法的对象将成为方法中this的值。

这不是this可以设置的唯一方式,但它是调用方法时的默认隐式行为。

所以你需要做的就是像往常一样创建一个Date对象,然后在该对象上调用你的方法让它对该对象进行操作。

var mydate = new Date();
mydate.setUTCDateOnly(item.date);

答案 1 :(得分:2)

因为你这样称呼你的方法

Date.prototype.setUTCDateOnly(item.date);

然后this值为Date.prototype

在ES5中,Date.prototype是一个Date对象:

  

Date原型对象本身就是一个Date对象(它的[[Class]]是"Date"),其[[PrimitiveValue]] NaN

因此,您可以在其上调用setUTCDateNaN刚刚在ToInteger内由MakeDay转换为+0

然而,这在ES6中发生了变化,现在Date.prototype被定义为

  

Date原型对象本身就是一个普通的对象。它不是   日期实例,没有[[DateValue]] internal slot

因此,尝试在其上调用setUTCDate会抛出。