借用函数原理 : 利用要使用方法的原型调用这个方法,再用call改变方法的this指向 (指向真正要使用这个方法的对象)
案例 1
需求 : 伪数组转真数组 : 希望伪数组也可以调用数组的方法
伪数组 : 有数组三要素(元素,下标,长度),但是没有数组的方法
* 伪数组本质是 对象 . 它的原型指向的是Object的原型,所以无法调用数组原型中的方法
代码 :
let obj = {
0: 88,
1: 90,
2: 100,
3: 66,
4: 50,
length: 5
}
/* 方式一:声明一个空数组, 遍历伪数组将元素添加到数组中 */
// let arr = []
// for (let i = 0; i < obj.length; i++) {
// arr.push(obj[i])
// }
// console.log(arr)
/* 方式二:利用push方法可以传递多个参数的特点 */
let arr = []
arr.push.apply(arr,obj)
console.log(arr)
思路解析 :
- 定义一个空数组 arr
- 用 arr 调用数组方法 push()
- 利用 push() 方法可以传递多个参数的特点,再用 apply() 方法改变 this 指向伪数组 obj
- 最后得到一个新的真数组
案例 2
需求 : 对伪数组排序
代码 :
let obj = {
0: 88,
1: 90,
2: 100,
3: 66,
4: 50,
length: 5
}
// 使用Array.prototype来调用sort,但是把sort里面的this修改为伪数组obj
Array.prototype.sort.call(obj, function (a, b) {
return a - b
})
console.log(obj)
思路解析 :
1.排序: 数组的sort()方法
2.报错: 因为伪数组原型指向Object而不是Array,所以无法调用数组的sort
解决方案: 先把伪数组转成真数组,然后调用sort
3.原因: 伪数组原型指向Object,无法调用Array.prototype里面的sort
4.思考: Array原型中的sort谁可以调用
(1)arr实例对象可以直接使用Array原型中的成员
(2)构造函数.prototype : Array.prototype.sort()
5.最后一个问题
如果是 arr.sort() : this指向arr
如果是 Array.prototype.sort() : this指向Array.prototype
6.最终解决方案: 使用Array.prototype来调用sort,但是把sort里面的this修改为伪数组obj
案例 3
需求 : 求数组最大值
代码:
/* 求数组最大值 */
let arr = [100, 20, 60, 88, 90]
//方式一:擂台思想
let max = -Infinity
for (let i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i]
}
}
console.log(max)
//方式二: Math.max()
let max1 = Math.max.apply(Math,arr)
console.log(max1)
思路解析 :
- JavaScript 内置对象 Math 有一个 max() 方法,可以找到一组数字之中的最大值
- 用 Math 对象调用 max() 方法,再用 apply() 方法改变 this 指向为数组 arr