ES6箭头函数、继承、this指针的一点小问题
const base = { name: 'HAHA' }
let ob = Object.create(base)
ob = {
showName() {
console.log(this, this.name);
},
showNameArrow: () => {
console.log(this, this.name);
}
}
ob.showName(); // Object{} undefined
ob.showNameArrow(); // window{} ""
第一个showName
的this既然指向ob对象,但是this.name
为什么不能通过原型向上查找到{name: 'HAHA'}
,而是undefined呢?
第二个showNameArrow
是因为我不知道在对象里如何写箭头函数:
是不是在对象里面因为不涉及块级作用域,就没有必要写箭头函数?
但是如果要写,应该怎么写?
我这种写法的箭头函数为什么指向全局?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
重覆声明,被盖掉了。如果要合成两个对象用
Object.assign
方法,例如:对象字面文字定义时,不会用箭头函数,这算是例外的应用情况。尤其是代码中有用到
this
时,大部份都不用箭头函数,不是不能用的问题,而是会得到不如预期的结果。其它还有常见的例外应用情况例如:在对象的prototype属性中定义的方法
DOM事件处理的监听者(事件处理函数)
构造函数
以及常见的箭头函数的应用上陷阱:
函数对象中的call、apply、bind三个方法,无法"覆盖"箭头函数中的this值。
箭头函数没有原本(传统)的函数有的隐藏arguments对象。
箭头函数不能当作generators使用,使用yield会产生错误。
在一些函数库像jQuery、underscore函数库有些有使用callback(回调, 回呼)的API中不一定可以用。
因为箭头函数会以对象在字面文字定义时,捕捉到的周边
this
为预设this
,也就是window
(浏览器)或全局对象(node),或是在严格模式下的undefined
。下面是另一个例子,与题主的例子相似,这例子中演示访问不到对象中的array属性值。
所以,这其实就是为什么在对象字面文字定义中,不要使用箭头函数的理由。你的问题已经自问自答了。
上面的例子与一些内容,主要参考自这篇: When 'not' to use arrow functions
第一个问题:
当程序运行到
let ob = Object.create(base)
,ob.name=== 'HAHA'没问题;但是当程序运行到
ob对象被重写,name属性自然就不存在了,这个时候ob就等于现在定义的了。
要想
showName
访问到name
可以这么写:第二个问题:
箭头函数里面没有自己的
this
,它的this
都是继承自它的外部,这里是window调用了showNameArrow
,所以this指向window
据说
name
在es6中是一个关键字,在这里window
下的name
没有被定义所以是""。关于箭头函数的
this
可以看这里先理解this吧,只有很清楚当前的this指向谁时,自然就知道箭头该不该用了