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。
总结
继续努力!
转载于:https://www.cnblogs.com/ChenYongHao/p/7790061.html