)
call/apply用法
定义
apply:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。
call:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法。
apply:最多只能有两个参数——新this对象和一个数组argArray。如果给该方法传递多个参数,则把参数都写进这个数组里面,当然,即使只有一个参数,也要写进数组里。如果argArray不是一个有效的数组或arguments对象,那么将导致一个TypeError。如果没有提供argArray和thisObj任何一个参数,那么Global对象将被用作thisObj,并且无法被传递任何参数。
call:它可以接受多个参数,第一个参数与apply一样,后面则是一串参数列表。这个方法主要用在js对象各方法相互调用的时候,使当前this实例指针保持一致,或者在特殊情况下需要改变this指针。如果没有提供thisObj参数,那么 Global 对象被用作thisObj。
使用
用来降低耦合,减少代码重复性
格式
1) call
1)
function Person(name, sex){
this.name = name;
this.sex = sex;
}
var obj = {
age:99
}
Person.call(obj, 'asd', 300);
console.log(obj);
结果
{age: 99, name: "asd", sex: 300}
2)
function Person(name, age){
//this == obj;
this.name = name;
this.age = age;
}
function Student(name,age,sex,address){
Person.call(this, name, age)
this.sex = sex;
this.address = address;
}
var stu = new Student('wu', 21, 'male', 'tangshan');
console.log(stu);
结果
Student {name: “wu”, age: 21, sex: “male”, address: “tangshan”}
2)apply
1)
function Person(name, sex){
this.name = name;
this.sex = sex;
}
var obj = {
age:99
}
Person.apply(obj, ['asd', 300]);
console.log(obj);
结果
{age: 99, name: "asd", sex: 300}
2)
function Person(name, age){
//this == obj;
this.name = name;
this.age = age;
}
function Student(name,age,sex,address){
Person.apply(this, [name, age])
this.sex = sex;
this.address = address;
}
var stu = new Student('wu', 21, 'male', 'tangshan');
console.log(stu);
结果
Student {name: “wu”, age: 21, sex: “male”, address: “tangshan”}
用法
1)apply 与 call 后接括号内第一个参数位需要得到信息的类
2)apply 括号内第一个参数以后后加数组 用来传参, call 后直接一个一个列出传参
原理
apply与call在本次使用中改变构造函数中this指向第一个参数的类
function Person(name, age){
//this == obj; 2)改变this指向obj,利用Person构造的信息传入增加到obj
this.name = name;
this.age = age;
}
function Student(name,age,sex,address){
Person.apply(this, [name, age]) // 1)使用call或apply 或call用法
this.sex = sex;
this.address = address;
}
var stu = new Student('wu', 21, 'male', 'tangshan');
console.log(stu);
部分定义转载于 点击