《call() 和 apply() 的 区别》
# apply
apply 应用某一对象的一个方法,用另一个对象替换当前对象
使用:apply(this, arguments)
function Person(name, age) {
this.name = name
this.age = age
console.log(this) // Student对象
}
function Student(name, age, grade) {
console.log(this) // Student对象,包含三个属性
console.log(arguments) // ['tony', 24, '一年级]
Person.apply(this, arguments)
this.grade =grade
}
var student = new Student('tony', 24, '一年级')
console.log('name:', student.name)
console.log('age:', student.age)
console.log('grade:', student.grade)
new Person('haha', 12) // Person对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# call
call:调用一个对象的一个方法,以另一个对象替换当前对象
使用:call(this, param, param...)
function Person(name, age) {
this.name = name
this.age = age
console.log(this) // Student对象
}
function Student(name, age, grade) {
console.log(this) // Student对象
Person.call(this, name, age) // 参数的顺序不能改变
this.grade =grade
}
var student = new Student('tony', 24, '一年级')
console.log('name:', student.name) // tony
console.log('age:', student.age) // 24
console.log('grade:', student.grade) // 一年级
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 区别
相同点:
- 用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
区别:
apply:只能有两个参数,this和argument,如果有多个参数,则都需要写进argument数组中,如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj,并且无法被传递任何参数
call:则是直接的参数列表,主要用在js对象各方法互相调用的时候,使当前this实例指针保持一致,或在特殊情况下需要改变this指针。如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
# 性能
call 会比 apply 速度要快。因为 apply 参数不确定,内部肯定要对 arguments 做一些循环处理。
# 应用场景
主要是用于实现继承
明确知道参数数量时,使用call, 否则使用apply
其他应用场景:
- 获取最大最小值
var arry = ['1', '2', '3', '2', '4']
Math.min.apply(null, arry); // 1
Math.max.apply(null, arry); // 4
1
2
3
2
3
- 检测类型
var a = {};
var b = [];
var c = ''
Object.prototype.toString.call(a) // [object Object]
Object.prototype.toString.call(b) // [object Array]
Object.prototype.toString.call(c) // [object String]
1
2
3
4
5
6
2
3
4
5
6