call
作用:改变this指向
传参:参数用逗号隔开
//普通函数调用this指向window
var addr = 'earth';
function fn(){
var addr = 'china';
console.log(this.addr);
};
fn(); //earth
- 用call改变this指向
//普通函数调用this指向window
var addr = 'earth';
function fn(){
var addr = 'china';
console.log(this.addr);
};
fn.call({addr:'usa'}); //usa , 将fn的this指向{addr:'usa'},并且调用fn函数
- 用call改变this指向并且向函数传入参数
function fn(b,c){
console.log(this.a + b + c)
};
fn.call({a:1} , 2 , 3) //6
- 通过call让类数组借用真数组的方法
//具备索引和length,是一个类似于数组的对象,但是对象没有push,shift等数组的方法,但是可以通过call借用
var not_arr = { 0:'a' , 1:'b' , 2:'c' , length:3 };
Array.prototype.push.call( not_arr , 'd' );
console.log(not_arr) ; //{ 0:'a' , 1:'b' , 2:'c' , 3:'d' , length:4 }
Array.prototype.push 的意思是通过数组的原型找到push方法,也可以[].push.call(),只要找到push即可。
然后改变push的this指向,让其指向not_arr对象
- 用call改变方法调用里的this并且传入参数
var tools = {
num:100,
fn:function(b,c){
console.log(this.a + b +c);
}
}
tools.fn.call({a:1} , 2 , 3) //6
- 用call实现借用构造函数继承
//定义一个人类,具有名字,年龄,住址的属性
function Person(obj){
this.name = obj.name ;
this.age = obj.age ;
this.addr = obj.addr;
};
Person.prototype = { } ;
//定义一个学生类,该学生类同样有名字,年龄,住址的属性,另外还有一个班级属性我们可以让学生
类的构造函数里的属性继承自Person,做法就是执行Person函数并且将其this指向Student的实例
function Student(obj){
Person.call(obj);
this.class_name = obj.class_name ;
};
Student.prototype = { } ;
var tom = new Student({name:'tom',age:18,addr:'usa',class_name:3});
console.log(tom.name , tom.age , tom.addr); //tom 18 usa
apply
apply和call的唯一区别是apply在传入参数的时候必须是数组或伪数组的形式
var tools = {
num:100,
fn:function(b,c){
console.log(this.a + b +c);
}
}
tools.fn.apply({a:1} , [2,3] ); //6
call和apply指向设为null
则函数内部this指向为window或者global