Array.prototype.slice.call()引发的思考

80 阅读1分钟

知识点:"类数组的概念","改变this指向","原型链方法的调用"

1.类数组:数据结构类似于数组的对象,对象属性是非负整数,且依次递增,并且带有length属性
如下图:可以通过标红的原型值判断出:上面是一个dom对象集合,下面是数组,展开的数据结构一致

1618369324(1).jpg

2.改变this指向:主要有三种方式,call,apply,bind,这次主要用call来做测试,其他方法不做赘述
下图是call的基本使用,调用主体是func对象,方法中的this指向取传入的对象

    function add(b){
	console.log(this.a+b);//打印结果3
    }
    let obj={
	a:1
    }
    add.call(obj,2);

3.原型链方法的调用
这里我根据自己的理解,简单仿写了Array的slice方法.

class CArray{		
    slice(start,end){
      let arr=[];
      for(let i=0;i<this.length;i++){
         if(i>=start&&i<end){
                 arr.push(this[i]);
         }
      }
      return arr;
    }
}
let objArr={
	0:1,
	1:2,
	2:3,
	3:4,
	4:5,
	5:6,
	length:6
}
let arr=[1,2,3,4,5,6];
console.log("objArr===="+CArray.prototype.slice.call(objArr,1,4));<br/>
打印结果    //a.html:36 objArr====2,3,4
console.log("arr======="+CArray.prototype.slice.call(arr,1,4));<br/>
打印结果   //a.html:37 arr=======2,3,4

#### 总结:
一.为什么通过原型方法调用call,入参支持类数组?
1.第一点提到的,数据结构类似
2.获取值的方法统一,例:数组通过下标取值arr[0],对象通过属性取值obj[0].

二.为什么对象不支持直接调用slice
因为slice是Array原型的方法