一、方法定义:
每个函数都包含两个非继承而来的方法:call()方法和apply()方法。
两个方法的作用是一样的:都可以改变this的指向(在特定的作用域中调用函数)
一般this总是指向调用某个方法的对象,但在使用call()、apply()后会改变this的指向。
- call:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2…); 即A对象调用B对象的方法。
- apply:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, [args1,args2…]); 即A对象应用B对象的方法。
call() apply()的参数:
B.call(A, args1,args2…);
B.apply(A, [args1,args2…]);
- B:父类对象
- 参数 A:子类对象
- args1:传给父类对象的参数
// 定义父类构造函数Person
function Person(name) {
this.name = name;
console.log(this.name);
}
// 继承构造函数
function Student2(name) {
// 使用call()方法继承父类构造函数,第二个参数用于传参
Person.call(this, name);
// name为实例化student2对象时传入的参数 “王五”,call再将参数传递给父类Person。
// 使用apply()方法继承父类构造函数,第二个参数以数组的形式表达,结果和call()相同
// Person.apply(this, [name]);
}
// 实例化子类student2对象s2
var s2 = new Student2("王五");
2、关于call()、apply()的改变this指向
// 给window添加属性x
window.x = 100;
function fn() {
console.log(this);
console.log(this.x);
}
fn();
// 此时this指向window,this.x --> 100
var obj = {
x: 500
}
fn.call(obj);
// 此时this指向obj,this.x --> 500
fn.apply(obj);
// 此时this指向obj,this.x --> 500
3、call()、apply()常用用法
用于继承
详情见:
https://blog.csdn.net/ZPD_zpd/article/details/113590528