new new Foo().getName()的执行情况

首先new Foo()得到一个空对象{}

第二步向空对象中添加一个属性getName,值为一个函数

第三步new {}.getName()

源代码等价于 var bar = new (new Foo().getName)(); console.log(bar)
​先new Foo得到的实例对象上的getName方法,
再将这个原型上getName方法当做构造函数继续new ,
​所以执行原型上的方法,打印3

参照:js的运算符优先级在这里插入图片描述

优先级:new(带参数列表)> 函数调用 > new(无参数列表)


原题目

function Foo() {
    getName = function () { alert (1); };
    return this;
}
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
var getName = function () { alert (4);};
function getName() { alert (5);}

//请写出以下输出结果:
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();

在第六问中首先看 new Foo().getName() ,这里运算符优先级括号高于new,实际执行为:(new Foo()).getName()
遂先执行Foo函数,而Foo此时作为构造函数却有返回值。在原题中,返回的是this,而this在构造函数中本来就代表当前实例化对象,遂最终Foo函数返回实例化对象。
之后调用实例化对象的getName函数,因为在Foo构造函数中没有为实例化对象添加任何属性,遂到当前对象的原型对象(prototype)中寻找getName,找到后输出3。

猜你喜欢

转载自blog.csdn.net/weixin_40599109/article/details/106817032
new
今日推荐