读js框架的时候, apply/call出现的频率很高,于是仔细查阅了一下这方面的资料,终于理解了一些。
apply(thisObj,[arg1,arg2....]):调用一个对象的一个方法,以另一个对象替换当前对象。(英文翻译过来的说法)
我是这样理解的:
1、thisObj作为句柄传入给当前对象方法内部的"this",该"this"就有了thisObj的方法和属性。
2、后面的参数arg1,arg2...都是传递给当前对象的参数。
3、thisObj这个对象也获得了当前对象的属性和方法。例子:
<script language="javascript">
var Person=function(name,age){//person类
this.name=name;
this.age=age;
this.personFun=function(){
alert("I am a Person");
}
this.sayMessage=function(){
alert("I am " +name);
if(this.tall){
//方法内部的this, 获得了thisObj即“OneInPerson”的属性tall
alert("I am " +this.tall+" tall");
}
}
};
var OneInPerson={
name:"OneInPerson",
age:"18",
tall:"170cm"
};
Person.apply(OneInPerson,[OneInPerson.name,OneInPerson.age]);
OneInPerson.sayMessage();
//OneInPerson也获得了当前对象的方法"sayMessage()"
/*相当于有两个对象a(OneInPerson)和b(Person),a先通过apply先把自己的属性和方法(tall)给b,然后a也有了b的方法和属性(sayMessage()),这样很有用,稍微改一下就实现了继承:*/
var Student=function(name,age,grade){
this.grade=grade;
this.sayGrade=function(){
alert("I am " +grade);
}//自己的方法
Person.apply(this,[name,age]);
/* 承上启下的作用:把上文的this给父类,而下文的this便有了父类的属性和方法,即而实现了继承,而对继承的东西再操作,即而实现了覆盖。*/
this.sayMessage=function(){
//覆盖父类Person的sayMessage()
alert("I am a student, " +"my name is "+this.name);
}
};
var stu=new Student("oneStudent","20","大一");
stu.personFun()//继承得到的
stu.sayMessage();//覆盖了
stu.sayGrade();//自己的
/*call()只是参数和apply不同, 其余用法一样。*/
</script>
以上是我个人的理解,不对的地方请大家指教、批评!
apply(thisObj,[arg1,arg2....]):调用一个对象的一个方法,以另一个对象替换当前对象。(英文翻译过来的说法)
我是这样理解的:
1、thisObj作为句柄传入给当前对象方法内部的"this",该"this"就有了thisObj的方法和属性。
2、后面的参数arg1,arg2...都是传递给当前对象的参数。
3、thisObj这个对象也获得了当前对象的属性和方法。例子:
<script language="javascript">
var Person=function(name,age){//person类
this.name=name;
this.age=age;
this.personFun=function(){
alert("I am a Person");
}
this.sayMessage=function(){
alert("I am " +name);
if(this.tall){
//方法内部的this, 获得了thisObj即“OneInPerson”的属性tall
alert("I am " +this.tall+" tall");
}
}
};
var OneInPerson={
name:"OneInPerson",
age:"18",
tall:"170cm"
};
Person.apply(OneInPerson,[OneInPerson.name,OneInPerson.age]);
OneInPerson.sayMessage();
//OneInPerson也获得了当前对象的方法"sayMessage()"
/*相当于有两个对象a(OneInPerson)和b(Person),a先通过apply先把自己的属性和方法(tall)给b,然后a也有了b的方法和属性(sayMessage()),这样很有用,稍微改一下就实现了继承:*/
var Student=function(name,age,grade){
this.grade=grade;
this.sayGrade=function(){
alert("I am " +grade);
}//自己的方法
Person.apply(this,[name,age]);
/* 承上启下的作用:把上文的this给父类,而下文的this便有了父类的属性和方法,即而实现了继承,而对继承的东西再操作,即而实现了覆盖。*/
this.sayMessage=function(){
//覆盖父类Person的sayMessage()
alert("I am a student, " +"my name is "+this.name);
}
};
var stu=new Student("oneStudent","20","大一");
stu.personFun()//继承得到的
stu.sayMessage();//覆盖了
stu.sayGrade();//自己的
/*call()只是参数和apply不同, 其余用法一样。*/
</script>
以上是我个人的理解,不对的地方请大家指教、批评!