知识点:"类数组的概念","改变this指向","原型链方法的调用"
1.类数组:数据结构类似于数组的对象,对象属性是非负整数,且依次递增,并且带有length属性
如下图:可以通过标红的原型值判断出:上面是一个dom对象集合,下面是数组,展开的数据结构一致
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原型的方法