1.开篇
1.1本文目标
记录一道面试时碰到的题目,题目已经很久,但很经典。
2.正文
2.1代码
1 function Foo() { 2 getName = function () { console.log (1); }; 3 return this; 4 } 5 Foo.getName = function () { console.log (2);}; 6 Foo.prototype.getName = function () { console.log (3);}; 7 var getName = function () { console.log (4);}; 8 function getName() { console.log (5);} 9 10 //以下输出值为多少? 11 Foo.getName(); 12 getName(); 13 Foo().getName(); 14 getName(); 15 new Foo.getName(); 16 new Foo().getName(); 17 new new Foo().getName();
2.2解释
(1)Foo.getName(),输出2,第5行向Foo中定义getName,所以输出2
(2)getName(),输出4,由于声明提前,所以最终结果是第7行。
(3)Foo().getName(),输出1,首先Foo()返回this,所以Foo().getName()调用的是全局的getName,但是执行Foo()的时候第2行把全局的getName改了,所以最终输出的是1。
(4)getName(),输出1,由于上一句把全局改了,所以这里也是输出1。
(5)new Foo.getName(),输出2,这是因为new的对象是Foo里面的getName,new的时候会执行对象内部的语句,所以会输出2。
(6)new Foo().getName(),输出3,这次new的对象是Foo,返回的是原型链上的东西,也就是第6行,所以调用getName()也就会输出3。
(7)new new Foo().getName(),输出3,首先执行的是第二个new,对象是Foo,返回Foo的原型,然后执行第一个new,这时new的对象是Foo原型上的getName,new的时候执行getName里面的语句,所以会这里会输出3。
总结
继续努力!