zoukankan      html  css  js  c++  java
  • 经典的Foo和getName

    搜了下经典的Foo和getName的题目,看了几个解释,懒得看,自己解一下,作为笔记。

    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的静态方法
    Foo.getName();//2
    
    //function getName有提前声明的规则,声明后被var getName= 。。覆盖,则getName为4
    getName();//4
    
    //Foo()的return this为window,window.getName 在Foo里面被覆盖,则输出1
    Foo().getName();//1
    
    //同上,因调用了Foo();window的getName被覆盖
    getName();//1
    
    //依然只是调用了Foo对象上的getName,又因为Foo.getNname,所以相当于
    /**
     *  function a(){console.log(2)};
     *  new a();
     * **/
    new Foo.getName();//2
    
    //先执行了new Foo();返回一个对象,这个对象的getName为prototype上的getName,相当于(new Foo()).getName();
    new Foo().getName();//3
    
    //
    new new Foo().getName();//3

    对于后三题,尤其是最后一个new new Foo().getName(),特别容易懵x

    对于带new的输出,用一个this来跟踪。

    function Foo(){
        this.a = 1;
        getName = function(){
            this.a = 11;
            console.log(1);
        };
        return this;
    } 
    
    Foo.getName = function(){
        this.a = 2;
        console.log(2);
    }
    
    Foo.prototype.getName = function(){
        console.log(3);
        this.a = 3;
      return "i'm prototype's getName"; }
    var getName = function(){ console.log(4); this.a = 4; } function getName(){ console.log(5); this.a = 5; } //相当于 new (Foo.getName()) var a1 = new Foo.getName();//2 console.log(a1.a);//2;

    //相当于 (new Foo()).getName(); 只是执行了一个prototype里getName()的方法,
    //这个方法若无返回则a2为undefined,
    //可以进一步确定,在prototype.getName中添加return ,则a2会等于return出来的结果 var a2 = new Foo().getName();//3
    console.log(a2.a);//报错:cannot read property a of undefinded;

    //这题输出的结果为3;从结果上看,相当于 new Foo.prototype.getName()
    //也就是说new Foo().getName() == Foo.prototype.getName()
    //所以执行的结果应该相当于 new ((new Foo()).getName())
    //这句话用通俗点说法就是,new了一个Foo对象A,然后以A原型里的getName()方法作为构造函数new了B,最后这个B.a = 3;
    //当然在new的时候执行构造器,就输出了3;

    var a3 = new
    new Foo().getName();//3
    console.log(a3.a);//3



  • 相关阅读:
    Extjs 4.x 得到form CheckBox的值
    你是工具综合症和资料收集狂患者吗?(转)
    计算机网络第五版(谢希仁)读书笔记(三)
    《别做正常的傻瓜》 读书笔记
    2013年11月27日,开始写专业的博客。
    web输入框的测试
    linux 文件操作相关函数
    Samba的安装
    linux df命令参数详解
    linux arp 命令常用参数详解
  • 原文地址:https://www.cnblogs.com/laojun/p/8287399.html
Copyright © 2011-2022 走看看