bug收集:专门解决与收集bug的网站
网址:www.bugshouji.com
01
面试题
看到一道非常经典的面试题,其中最大的亮点就是关于new new Foo().getNam() 的输出结果,话不多说,下面就来看看这道题
function Foo(){
getName=function(){alert(1);}
return this;
}
Foo.getName=function(){alert(2);}
// Foo.prototype.getName=function(){
// alert(3);
// }
Foo.prototype.getName=function(){
alert(3);
this.show=function(){
console.log('in')
}
}
var getName=function(){alert(4);}
function getName(){alert(5);}
//请写出下面方法的输出结果
Foo.getName();
getName();
Foo().getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();
var obj = new new Foo().getName();
大家,可以先自己思考下答案,再看下面的答案与解析
02
结果解析
Foo.getName(); //2
相当于调用名叫Foo.getName的一个函数,所以输出2
getName(); //4
就相当于调用getName函数,所以输出4
Foo().getName(); //1 ,
先调用Foo()函数,它将返回this,this 这里指window,在Foo里有一个变量getName,因没有var,算是全局变量
所以,执行完Foo后,window.getName,调用的就是Foo中的getName中,它把最外面的getName重写了.所以执行getName(); 输出结果1
new Foo.getName(); // 2
这里Foo后面没有括号,所以Foo.getName会看成一个函数的名称
new Foo().getName(); //3
先执行new Foo() , 会产生一个实例化对象,然后在执行getName,即prototype添加的getName
new new Foo().getName(); //3
先执行new Foo(), 再执行getName() , 然后在执行第一个new 这个new 将,实例化Foo中prototype 中的getName
为证明上面的说法 ,我将如下代码进行了修改:
Foo.prototype.getName=function(){
alert(3);
this.show=function(){
console.log('in')
}
}
然后执行,下面的代码:
var obj = new new Foo().getName();
obj.show();
通过,上面的代码,发现in 可以打印, 说明new new, 其它先执行后面的new, 即new Foo().getName(), 在执行第一个new ,第一个new其实new的是Foo实例对象中的getName方法