TypeError:这不是Date对象
TypeError: this is not a Date object
知道为什么这在Chrome中不起作用吗var foo = (new Date).getDate;
foo();
我得到一个TypeError:这不是Date对象。然而(new Date).getDate()
在上工作
在您的示例中,函数没有正确绑定。该foo调用的"this"对象不是原始日期对象。
使逻辑工作的一种方法是绑定函数:
var x = new Date();
var foo = x.getDate.bind(x);
foo();
在JavaScript中,this
上下文是而不是绑定到对象的每个方法。相反,它是在运行时由调用该方法的方式决定的。有关绑定行为的更多信息,请查看此答案。。
在您的代码中,foo
接收new Date
的getDate
属性,它通过原型链从Date.prototype
接收该属性。因此,您的代码实际上相当于:
var foo = Date.prototype.getDate;
foo();
(自己测试:在控制台中验证(new Date).getDate === Date.prototype.getDate
确实是true
。)
现在,应该清楚的是,该调用没有实际的this
上下文。您可以通过手动将函数bind
添加到对象来预先设置它。(注意:较旧的浏览器需要Function.prototype.bind
的shiv。)
var foo = Date.prototype.getDate.bind(new Date);
foo();
或者,在call
/apply
函数时设置正确的this
上下文。
var foo = Date.prototype.getDate;
foo.call(new Date);
问题是,当您调用函数时,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);
您想要做的是
var date = new Date;
var foo = date.getDate.bind(Date)
foo()
或
var date = new Date;
var foo = date.getDate;
foo.call(date);
当您像以前那样调用foo
时,它不会引用日期对象,这就是它抛出错误的原因。
foo
只是一个不与任何对象绑定的函数。它需要来自Date
对象的一些其他信息才能被调用。你可以这样做:
var date = new Date()
var foo = date.getDate
foo.call(date)
相关文章:
- date对象未在javascript中返回正确的日期值
- Date对象未返回预期年份
- JS:如何将字符串(“2015年3月10日”)转换为Date对象
- 当绑定到Date()-对象时,如何格式化input[time]的值
- Javascript Date 对象因格式而异:yyyy-mm-dd vs mm-dd-yyyy
- 将Date对象转换为毫秒
- 为什么我的Date对象返回当前日期
- Javascript Date对象到日期字符串
- Date对象在Chrome中有效,但在Safari、Firefox或IE中无效
- 如何使用moment.js测试javascript对象是否为Date
- 如何测试Date对象是否等于特定日期
- 为什么js会从具有特定格式的Date对象中减去一天
- highcharts:将useUTC=true milliseconds转换为javascript Date对象
- 将 JavaScript Date 对象格式化为特定格式
- 从 Date() 对象返回 dd-mm-yyyyy
- Javascript Date 对象失败
- Date 对象在尝试计算 IE8 中两个日期之间的时间时返回 NaN
- 如何从字符串构造一个 javascript Date 对象
- 与 API 一起使用时,将 Date 对象存储在数据库中的最佳实践是什么
- 将字符串转换为 JavaScript 的 Date 对象的方法