我在google chrome和firefox中遇到此代码的问题。 this.setUTCDate(1);
抛出Uncaught TypeError:这不是Date对象。我该如何解决?
我看过this和this,但我找不到任何可以解决问题的方法。
Date.prototype.setUTCDateOnly = function(date) {
var tmp = new Date(date);
this.setUTCDate(1);
};
我这样称呼它:
var date = Date.prototype.setUTCDateOnly(item.date);
答案 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 。
因此,您可以在其上调用setUTCDate
。 NaN
刚刚在ToInteger内由MakeDay转换为+0
。
然而,这在ES6中发生了变化,现在Date.prototype
被定义为
Date原型对象本身就是一个普通的对象。它不是 日期实例,没有[[DateValue]] internal slot。
因此,尝试在其上调用setUTCDate
会抛出。