每个函数都包含两个非继承而来的方法:call()方法和apply()方法。
在JavaScript中,call/apply的作用是:
1.相同点:都是改变this指向
2.区别:后面传的参数形式不同。
call()方法使用示例:
function Person(name,age){
//this == obj
this.name = name;
this.age = age;
}
var person = new Person('deng',100);
var obj = {
}
Person.call(obj,'cheng',300);
//后面传的是实参
call的作用是:改变Person()中的this指向,使 this = obj ,this.name = name–>obj.name
this.age = age–>obj.age
再传回空对象obj里面。
var obj = {
obj.name = name;
obj.age = age;
}
就像相当于现在有一个功能十公俱全的车间Person,然后现在创建一个空的车间obj,然后obj要复制Person里面的功能,这样我们就可以用到call来改变Person()里面的this指向,来进行复制功能或者方法,达到自己的所用。
给personcall里面传入一个obj的一个空对象,obj会取代this,然后它后面的参数会取代this的属性name和age,利用别人的方法实现自己的功能,借助别人的函数,借助perosn的构造函数来构造自己的功能。
举个例子;
function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
function Student(name,age,sex,tel,grade){
this.name = name;
this.age = age;
this.sex = sex;
this.tel = tel;
this.grade = grade;
}
var student = new Student('sunny',123,'male',139,2017);
创建两个构造函数,Person()和Student()
可以看到这两个函数有三个属性示一模一样的,我们就可有用call来实现功能的复制。
function Person(name,gae,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
function Student(name,age,sex,tel,grade){
// var this = {name:"",age :"", sex:""}
Person.call(this,name,age,sex);
this.tel = tel;
this.grade = grade;
}
var student = new Student('sunny',123,'male',139,2017);
// Person.call(this,name,age,sex)-->this.name = name;
this.age = age;
this.sex = sex;
为何Person.call(this,name,age,sex)就等同于这三个属性
因为在创建new的时候,构造函数内部就存在了一个隐式的this–>var this = {};
然后 Student里面的this会改变Person内部this的指向,使它指向自己的this,从而实现复制。
apply的功能和call的功能是一模一样的,只不过apply里面必须是传一个数组
call:需要把实参按照形参的个数传进去
apply:需要传一个arguments