《call() 和 apply() 的 区别》


2017-10-26 上次更新时间:8/21/2020, 10:08:11 AM 0 javascript

# 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

# 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

# 区别

相同点:

  • 用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

区别:

  • apply:只能有两个参数,this和argument,如果有多个参数,则都需要写进argument数组中,如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj,并且无法被传递任何参数

  • call:则是直接的参数列表,主要用在js对象各方法互相调用的时候,使当前this实例指针保持一致,或在特殊情况下需要改变this指针。如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

# 性能

call 会比 apply 速度要快。因为 apply 参数不确定,内部肯定要对 arguments 做一些循环处理。

# 应用场景

  • 主要是用于实现继承

  • 明确知道参数数量时,使用call, 否则使用apply

其他应用场景:

  1. 获取最大最小值
var arry = ['1', '2', '3', '2', '4']
Math.min.apply(null, arry); // 1
Math.max.apply(null, arry); // 4
1
2
3
  1. 检测类型
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
上次更新时间: 8/21/2020, 10:08:11 AM