请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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么?
麻烦老师,帮忙解决一下技术难题,万分感谢。

正在回答 回答被采纳积分+3

2回答

六一888 2019-11-21 19:28:07

第一道题的回答:

运算符优先级是这样的:

首先: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 回复 有任何疑惑可以回复我~
快乐动起来呀 2019-11-19 00:28:13

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

0 回复 有任何疑惑可以回复我~
  • 提问者 meimei1314 #1
    在答案区搜索过了,
    第1个问题,没有我想要的答案。(老师只是给了运算符优先级文档地址,但是我是看过这个文档和老师的讲解后,有疑惑,所以提问的)
    第2个问题,没有答案。
    麻烦老师,帮忙解答一下。谢谢。
    回复 有任何疑惑可以回复我~ 2019-11-19 21:48:02
  • 快乐动起来呀 回复 提问者 meimei1314 #2
    你看下这个同学的答案,大家反馈这个都理解:http://coding.imooc.com/learn/questiondetail/73639.html
    回复 有任何疑惑可以回复我~ 2019-11-21 23:23:50
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信