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; }
调用结果:
浙公网安备 33010602011771号