关于new Foo().getName()的问题

来源:7-2 一道函数考察基本功

meimei1314

2019-11-17

function Foo() {
	getName = function () {
		console.log( 1 )
   }
   return this
}
Foo.prototype.getName = function() { console.log( 3 ) }
new Foo().getName( ) // 3

关于以上代码,有2个问题。
第一,关于优先级:
成员访问的优先级高于new(带参数列表)。
所以不应该是等于new ( Foo( ).getName( ) )么?这样的话,答案应该是1吧?
第二,关于new返回值的问题。
如果使用new关键字的时候,有return,且return后面是一个对象的话,返回这个对象,而不是new后的实例。
上面的题中,return this,this是指向的是window,是一个对象,所以new Foo( ).getName( )中,调用的getName函数是全局函数,返回的值应该不是1么?
麻烦老师,帮忙解决一下技术难题,万分感谢。

写回答

2回答

六一888

2019-11-21

第一道题的回答:

运算符优先级是这样的:

首先:new 无参数列表(18)的优先级低于成员访问运算符(19),这个很好理解

所以 new Foo.getName() 要先执行点的运算符

但要注意 new 带参数列表(19)的优先级是等于成员访问运算符(19)的!

所以 new Foo().getName() 要先执行 new Foo() 因为它在左边

第二道题的回答:

当 new 一个函数时,new 运算符会帮助构造函数创建一个实例对象,最终将这个对象返回出去。此时 this 指的是实例对象,而不再是全局对象 window。只是单纯的运行 Foo() 函数的话,由于 Foo 函数运行的环境是全局环境,所以 this 才是 window。但如果是 ES6 写的函数,其中的 this 代表的是定义函数的环境。所以这都属于作用域的知识点。

还有,我觉得老师没有回答得那么详细,是为了让我们自己思考,我觉得这样的一个过程对知识的理解会更彻底。

0
0

快乐动起来呀

2019-11-19

同学我记得已经回到过这个问题了,你可以搜下问答区

0
2
快乐动起来呀
回复
meimei1314
你看下这个同学的答案,大家反馈这个都理解:http://coding.imooc.com/learn/questiondetail/73639.html
2019-11-21
共2条回复

前端跳槽面试必备技巧 面试官全流程指导

一门让你能成功获取前端 Offer 的课程, 不只是技术,面试“技巧”也至关重要

4836 学习 · 830 问题

查看课程