_TANGTANG

导航

JS中this的指向问题&使用call或apply模拟new

  this的指向由调用时决定而不是定义时决定,定义的方式:

        //直接定义在函数里
        var a="window中的a";
        var name="window";
        function aa(args1,args2){
            console.log(this.a+args1+args2);
        }
        aa();   //this=window
        //定义在对象中
        var o={
            a:"o中的aaa",
            name:"nicole",
            print:function(){
                console.log(this.name);
            }
        };
        o.print();    //nicole,this=o
        //将对象的方法赋给其他变量,this由该变量决定。
        var bb=o.print;
        bb();  //widnow,this=window
        //使用call&apply改变this指向
        
        aa.call(o,"+abc","+def");    //在o中执行,aa(args1,agrs2)方法,参数单个接收
        aa.apply(o,["+abc","+def"]);  //在o中执行,aa(args1,agrs2)方法,参数接收数组形式
        aa("+abc","+def");
        //获取DOM节点,对该节点添加的事件中,this一般指向该节点对象。

call重写新对象的属性:

        function p(){
            this.name="abc";
            this.age=24;
        }
        o={
            name:"niole"
        };                

执行完p.call(o);后,name&age被写入o,并且将原来的o.name覆盖:(apply也可以)

因为:p.call(o)等价于o.p(),p()执行完毕后,p中的this=o,p()执行后,o.name="abc",o.age=24;

根据上面的特性,模拟new的实现:

        function Person(name,age){
            this.name=name;
            this.age=age;
        }
        var p1=new Person("nicole",24);        
        
        //教学视频:模拟new
        function pnew(f){
            return function(){   //返回Person
                var o={"__proto__":f.prototype};  //实例对象
                f.apply(o,arguments);
                return o;  //返回实例对象
            }
        }
        //自己改编
        function ppnew(f,name,age){
            var o={"__proto__":f.prototype};
            var arr=[];
            for(var i in arguments){
                arr[i]=arguments[i];
            }
            arr.splice(0,1);
            f.apply(o,arr);
            return o;
        }

 

调用结果:

posted on 2016-09-08 17:24  _TANGTANG  阅读(411)  评论(0)    收藏  举报