每日一道面试题

187 阅读1分钟

20210825 面试题

 function Foo(){
     getName = function () {
         console.log(1);
     }
     return this;
 }
 ​
 Foo.getName= function () {
     console.log(2)
 }
 ​
 Foo.prototype.getName = function () {
     console.log(3);
 }
 var getName = function () {
     console.log(4);
 }
 ​
 function getName(){
     console.log(5);
 }
 ​
 Foo.getName();
 Foo().getName();
 getName();
 new Foo.getName();
 new Foo().getName();
 new new Foo().getName();

参考答案

1.Foo.getName();

  • 调用的是Foo的静态方法, 所以 , 打印2

2.Foo().getName()

  • Foo() 就是普通函数调用, 返回的thiswindow,后面调用的window.getName() ,而window下的getName()Foo() 中调用被getName() 重新赋值, 所以打印1

3.getName()

  • 在执行过Foo().getName() 的时候, 把window下的getName() 覆盖了, 所以打印的是1,
  • 如果getName() 放在Foo().getName 之前执行, 那么getName() 打印的就是4了。

4.new Foo.getName()

构造器私有属性的getName(),所以打印3

5.new Foo().getName();

  • 原型上的getName(), 所以打印3

6.new new Foo().getName();

  • 首先new Foo() 得到一个 空对象{}
  • 第二步 向空对象中添加一个属相 getName,值为一个函数
  • 第三步 new {}.getName();
  • 等价于 var bar = new (new Foo().getName)(); console.log(bar)
  • 先执行new Foo 得到的实例对象中得getName方法, 再将这个原型上getName方法当做构造函数 继续new 所以执行原型上的方法, 打印3