说出并解释下列代码的输出结果

  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()就是普通函数调用,返回的this是window,后面调用window.getName() ​ 而window下的getName在Foo()中调用getName被重新赋值,所以,打印1

3、 getName()

​ 在执行过Foo().getName()的基础上,所以getName=function(){console.log(1)},所以,打印1,[如果getName()放在Foo().getName()上执行打印结果为4]

4、 new Foo.getName()

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

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