关于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 代表的是定义函数的环境。所以这都属于作用域的知识点。
还有,我觉得老师没有回答得那么详细,是为了让我们自己思考,我觉得这样的一个过程对知识的理解会更彻底。
00 -
快乐动起来呀
2019-11-19
同学我记得已经回到过这个问题了,你可以搜下问答区
022019-11-21
相似问题