doubleyong
管理员
管理员
  • 最后登录2026-05-25
  • 发帖数1198
  • 最爱沙发
  • 喜欢达人
  • 原创写手
  • 社区居民
  • 忠实会员
阅读:6539回复:0

new new Foo 面试题剖析

楼主#
更多 发布于:2018-01-27 09:52

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();  //2   , 相当于调用名叫Foo.getName的一个函数,所以输出2
// getName();     //4     , 直接输入getName,相当于调用getName ,声明式函数
Foo().getName();  //1 ,
 // Foo().getName() , 先调用Foo()函数,它将返回this,this 这里指window,在Foo里有一个变量getName,因没有var,算是全局变量
 // 所以,执行完Foo后,window.getName,调用的就是Foo中的getName中,它把最外面的getName 重写了
// getName(); // 1  在这里我们在执行getName,这里输出的就是了
// 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
//为证明第二个new ,我将如下代码进行了修改:
//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方法
*/

最新喜欢:

唯一的信仰唯一的信仰
知识需要管理,知识需要分享
游客


返回顶部

公众号

公众号