经典面试题

    function Foo() {
      getName = function () { alert(1); };
      return this;
    }
    Foo.getName = function () { alert(2); };
    Foo.prototype.getName = function () { alert(3); };
    var getName = function () { alert(4); };
    function getName() { alert(5); }

    //请写出以下输出结果:
    Foo.getName(); // 2 Foo.getName 属于给Foo函数定义静态属性优先级高于方法内部定义
    getName(); // 4  function getName()变量提升,声明后被var getName= function(){...}覆盖,
    Foo().getName(); // 1  调用Foo()函数,返回的this,则当前的全局window变为Foo内部的this,再调用getName()时就是调用Foo内的getName(),
    getName(); // 1  由于第三步已经将Foo的this覆盖了window,调用getName()时,仍然时调用Foo的getName(),
    new Foo.getName(); // 2  等价于new (Foo.getName()),先执行Foo.getName(),输出2,再创建Foo.getName()方法的实例。
    new Foo().getName();// 3  相当于(new Foo()).getName(),先创建Foo的实例,调用实例的getName()方法,由于自身没有该方法,去原型链上找,它的原型指向构造函数的prototype,即调用Foo.prototype.getName(),
    new new Foo().getName(); // 3  相当于new (new Foo().getName()),即先执行new Foo().getName(),由第六步可知,输出3,再创建Foo.prototype.getName()这个函数的实例返回。

  

posted @ 2020-08-03 15:16  KepCalm  阅读(48)  评论(0)    收藏  举报