每个函数都包含两个非继承而来的方法:call()和apply(), 这两个方法是为了动态改变上下文,即改变this指向而出现的,
当一个object中没有某个方法,而其他对象的有,我们就可以借助call或apply用其它对象的方法来操作
1、不带参数的call()
Function.call(obj) //不带参数
看一个例子,本例调用 person 的 fullName 方法,并用于 person1,他实现了通过 call()成功使用属于另一个对象的方法。
var person = {
fullName: function() {
return this.firstName + " " + this.lastName;
}
}
var person1 = {
firstName:"Bill",
lastName: "Gates",
}
var person2 = {
firstName:"Steve",
lastName: "Jobs",
}
person.fullName.call(person1); // 将返回 "Bill Gates"
2、带参数的call()
Function.call(obj,param1,param2,param3,....)
看个例子,此例调用 person 的 fullName 方法,在 person1 上使用它
var person = {
fullName: function(city, country) {
return this.firstName + " " + this.lastName + "," + city + "," + country;
}
}
var person1 = {
firstName:"Bill",
lastName: "Gates"
}
person.fullName.call(person1, "Seattle", "USA");//返回 Bill Gates ,Seattle,USA
3、apply()
apply方法和call方法,非常相似,不同之处在于call方法如果需要传参的话要一个一个的传
如:call(this,参数1,参数2,参数3,参数4...)
而apply()传的必须是个数组不然会报错 ,如: apply(this,[参数1,参数2,参数3,参数4...])
举个例子:和带参数的call()例子对比,可以清楚看到,参数形式的不同
var person = {
fullName: function(city, country) {
return this.firstName + " " + this.lastName + "," + city + "," + country;
}
}
var person1 = {
firstName:"John",
lastName: "Doe"
}
person.fullName.apply(person1, ["Oslo", "Norway"]);
apply()也分带参和不带参两种情况,但与call是一样的,这里只列举带参情况
ps:学习过程的简单记录,如有不恰当之处,欢迎大佬指正!