扩展数组方法
写在前面
问:了解原型链,了解作用域,js执行顺序等等,其实在日常的开发中好像真的感觉不到,原型链,作用域,js执行顺序,包括今天写得数组扩展方法,在现在框架成熟的今天,vue,react ,js框架+element 或者antd等等,好像就用不到这些东西,是不是就不需要看这些东西了?
答:不是
其实是息息相关,因为底层是js,框架里有原型链,函数报错的时候,觉得莫名其妙,其实你可能不够熟悉js的作用域,js的执行顺序
1.关于原型链
是这样,我本来也没有给数组的原形扩展方法,故事的开始,是一个数组问题,一些装杯的小伙伴
1.1 故事的开始,手写index
小儿子说,我要手写一个数组查询某值得方法吗,其实就是indexOf么,
然后,我让大儿子写,我就是循环item==item
大儿子大概就写了这样一段
/**
*params []nums
*return bool || num
*/
//就是入参是一个数字,有值返回下标,没值返回-1,也不考虑性能
//啥的
function find (arr,num) {
for (let a = 0; a < num.length; a++ ){
if(arr[i] == num){
return i
}
}
return -1
}
1.2 故事的矛盾点,数组方法直接给Array原形扩展方法
但是小儿子看了网上的说不一样,有原形链。现在回想一下确实追加也方便
然后我就开始写
/**
*params []nums
*return bool || num
*/
//我说这特么不是直接追加就完事了么 装什么杯 非得封装
Array.prototype.myFind = function find (arr,num) {
for (let a = 0; a < num.length; a++ ){
if(arr[i] == num){
return i
}
}
return -1
}
1.3 又一次悟到了原形链
我说这特么不是直接追加就完事了么 装什么杯 非得封装到数组圆形上,但是我突然就发现了问题。数组之前用的方法都是直接 . 出来的
//比如这样
var arr = [1,2,3]
arr.push(1)
arr.pop(1)
//很明显入参只有一个num 而我们封装的需要入参两个,就是a.myFind(a,num)
//很拉胯
// 然后我突然意识到 在给数组原形封装的时候 我不知道使用的当前数组的原对象是什么
很明显入参只有一个num 而我们封装的需要入参两个,就是a.myFind(a,num)
很拉胯
然后我突然意识到 在给数组原形封装的时候 我不知道使用的当前数组的原对象是什么
然后我去查了下 封装的方法里this 就代表的当前数组,(其实就是实例化对象)
/**
*params []nums
*return bool || num
*/
//我说这特么不是直接追加就完事了么 装什么杯 非得封装
Array.prototype.myFind = function find (num) {
for (let a = 0; a < num.length; a++ ){
if(this[i] == num){
return i
}
}
return -1
}
1.4 故事的高潮,发现问题,返现没动手写过数组追加方法的自己是猪
然后就才意识到 之前特么写原型链的时候不是写过。构造函数的中的this,就是指的实例化对象。而写得任意的数组,其实就是构造函数数组的实力话对象,只不过直接用了 [] 这种隐式创建的声明方式,其实他就是new Array()
//我们每次声明一个数组
let a = [1, 2, 3]
//其实就是等于下面这行代码
let a = new Array(1, 2 ,3)
// 也可以这样写
let a = new Array()
a[0] = 1
a[1] = 2
a[2] = 3
//甚至可以这样写
let a = new Array(3)
a[0] = 1
a[1] = 2
a[2] = 3
其实,这里没声明一个数组,就是等于实例化,new了一个新的数组对象,而数组中this,指的就是每一个实例化对象
之前写的关于原型链的东西 – 原型链 混乱笔记自己看版
小尾巴,之前写的js中的this到底指什么,居然阅读量很高,但是之前没写好,擦 ,完了记得重新一次哦,小王