js 杂记

  1. this指向

      function child2(){//属于window
            parent.call(this);
            console.log(this);
        }
    
        var c2=new child2();
        console.log(c2.name);//this指的是c2
        child2();//this指的是window
    
        function p(){
            function p1(){
                console.log(this);
            }
            p1();
        }
        p();//this指的是window
    
        p.p2=function(){
            console.log(this);
        }
        p.p2();//this指的是p
    
        function k(){        
        }
        k.p2=p.p2;
        k.p2();//this指的是k
    
    

    this,谁调用的指向就是谁,这个“谁"可以是任何定义(在内存中一块有效的区域),函数,对象,window等

  2. __proto__

    
        function p(){
    
        }
        var obj={__proto__:p.prototype};
        console.log(obj);//实际上obj变为了p对象
        var pobj=new p();
        console.log(pobj);//pobj和obj都是p对象,区别在于pobj执行了p函数,而obj没有
    
    

    只要一个对象的__proto__指向某个函数fn的prototype,则该对象变为fn对象

  3. prototype

    function a(){
            this.name="a";
        }
        a.prototype.print=function(){
    
        };
        var b=new a();
        var c=new a();
        console.log(b.__proto__==c.__proto__);//ture
        console.log(c.__proto__==a.prototype);//true
        console.log(b==c);//false
    
    • 每个js对象或函数都有一个内置的[[Prototype]]属性,可以通过 .__proto__来访问
    • 只有function 有一个prototype属性其是一个对象
    • 每个new 的js对象的[[Prototype]]都指向了其函数的prototype属性,所以prototype属性是被对象共享的
      第一种写法
        function a(){
            this.name="a";
        }
        a.prototype.print=function(){
    
        };
        第二种写法
        function a(){
            this.name="a";
            this.print=function(){
    
             }
        }
    
    • 第一种写法的print函数被所有实例共享
    • 第二种写法的print函数,每个实例都复制了一份,浪费了内存资源
    function a(){
        this.fn=function(){
        };//a的所有实例都会有该方法的一个拷贝。
    }
    a.fn=function(){
    };//fn是a的私有方法
    a.prototype.fn=function(){
    };//fn被a的所有实例共享
    
  4. js执行顺序

你可能感兴趣的:(js,javascript,前端)