JavaScript Date对象添加自定义方法时普通函数与箭头函数差异问题
问题原因
该报错的核心原因是箭头函数与普通函数的this绑定规则存在本质差异:
- 普通函数的
this是运行时动态绑定的:当你将普通函数赋值给Date.prototype作为实例方法,调用时this会自动指向触发方法调用的Date实例对象,所以可以正常调用实例自带的getFullYear原生方法。
普通函数实现的可运行代码如下:Date.prototype.lastYear = function () { console.log(this.getFullYear() - 1) } - 箭头函数没有独立的
this,它的this是词法静态绑定的:只会继承自身定义位置外层作用域的this,和调用方式、调用对象没有任何关系。你在全局作用域下给Date.prototype赋值箭头函数时,该箭头函数的外层作用域就是全局作用域,this指向全局对象(浏览器环境为window,Node.js环境为globalThis),全局对象上不存在getFullYear方法,因此调用时会抛出TypeError。
报错的箭头函数实现代码如下:Date.prototype.lastYear = () => { console.log(this.getFullYear() - 1) }
补充说明
箭头函数天生不适合用来定义对象方法、类原型方法,这类场景都依赖this动态指向调用方实例,刚好是箭头函数不支持的特性,日常开发时要注意规避。
内容的提问来源于stack exchange,提问作者p4avinash
相关产品推荐
相关产品推荐

