TypeError:这不是Date对象

时间:2013-07-27 15:47:00

标签: javascript

知道为什么这在Chrome中不起作用?
var foo = (new Date).getDate;
foo();

我得到一个TypeError:这不是Date对象。但是(new Date).getDate()有效

5 个答案:

答案 0 :(得分:4)

在您的示例中,该函数未正确绑定。该foo调用的“this”对象不是原始日期对象。

使逻辑工作的一种方法是绑定函数:

var x = new Date();
var foo = x.getDate.bind(x);
foo();

答案 1 :(得分:1)

问题在于this在调用函数时不是日期而是全局上下文(window)。

你可以这样做:

foo.call(new Date());

或者,如果您希望能够在任何地方使用该功能并仍然使用原始日期,您可以使用

var date = new Date();
var foo = function() { return date.getDate() }; // returns always the same date

var foo = function() { return (new Date()).getDate() }; // returns the current date

如果没有IE8,您也可以使用bind

var foo = date.bind(date);

答案 2 :(得分:0)

你想要做的是

var date = new Date;
var foo = date.getDate.bind(Date)
foo()

var date = new Date;
var foo = date.getDate;
foo.call(date);

当您像调用foo时一样,它将没有对日期对象的引用,这就是它抛出错误的原因。

答案 3 :(得分:0)

因为代码中的foo只是一个不与任何对象绑定的函数。它需要来自Date对象的一些其他信息才能被调用。你可以这样做:

var date = new Date()
var foo = date.getDate
foo.call(date)

答案 4 :(得分:0)

在JavaScript中,this上下文绑定到对象的每个方法。相反,它是在运行时通过调用方法Check this answer for more about the binding behaviour.确定的。

在您的代码中,foo会收到getDate new Date的{​​{1}}属性,它通过原型链从Date.prototype收到。因此,您的代码实际上等同于:

var foo = Date.prototype.getDate;
foo();

(自行测试:在您的控制台中验证(new Date).getDate === Date.prototype.getDate确实是true。)

现在,应该清楚该调用没有实际的this上下文。您可以通过手动bind将函数设置为对象来预先设置它。 (注意:Function.prototype.bind的{​​{3}}。)

var foo = Date.prototype.getDate.bind(new Date);
foo();

或者,在this / call函数时设置正确的apply上下文。

var foo = Date.prototype.getDate;
foo.call(new Date);