|
阅读:6538回复:0
new new Foo 面试题剖析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方法 */ |
|
最新喜欢:
|