JS手写New操作符

JavaScript029

JS手写New操作符,第1张

手写new操作符的流程:

 // 1.定义一个空对象

 // 2.隐式原型指向构造函数的显式原型

// 3.执行构造函数,this指向空对象

 // 4.返回对象

function myNew(fn,...args){

        // 1.定义一个空对象

          const obj={}

         // 2.隐式原型指向构造函数的显式原型

         obj._proto_=fn.prototype

         // 3.执行构造函数,this指向空对象

        fn.apply(obj,args)

          // 4.返回对象

        return obj

        }

数组扁平化定义:在前端项目开发过程中,偶尔会出现层叠数据结构的数组,需要把多层数组转换为一级数组(即提取嵌套数组元素最终合并为一个数组),使其内容合并并且展开。

遍历数组的方案:

for循环

for...of

for...in

forEach()

entries()

keys()

values()

reduce()

map()

判断元素是否是数组的方案:

instanceof

constructor

object.prototype.toString.call

isArray

将数组元素进行展开一层的方案:

扩展运算法 + concat(concat() 方法用于合并两个或多个数组,在拼接的过程中加上扩展运算符会展开一层数组)

concat + apply(主要是利用 apply 在绑定作用域时,传入的第二个参数是一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 func 函数。也就是在调用 apply 函数的过程中,会将传入的数组一个一个的传入到要执行的函数中,也就是相当对数组进行了一层的展开。)

toString + split(不推荐使用 toString + split 方法,因为操作字符串是很危险的事情,如果数组中的元素所有都是数字的话,toString + split 是可行的,并且是一步搞定。)

最终手写的flat()方法为:

参考博客如下,注明一下出处,感谢大神们,希望自己可以多多练习,多多回顾:

三元博客

JS数组reduce()方法详解及高级技巧

数组flat方法实现

先看一个 bind 函数的例子:

如果我们要手写一个 bind 函数的话,我们需要知道 bind 拿了什么参数,干了什么:①接收一个对象(this);②接受n个参数;③返回函数。

那么需求我们知道了,如何实现呢?

首先 fn1 对于 Function 来说是 Function 的实例,这个没有问题吧。那么肯定有 fn1.__proto__ === Function.prototype 。 Function.prototype 中是有 call 、 apply 等函数的API,既然这样我们就用我们原型 Function 的方法~

我们不确定bind的参数传几个,我们所知道的只是第一个参数是 this 要指的对象,第二个一直到最后一个参数我们都不确定,所以我们在手写的时候没法一个一个接收参数,所以第一步我们要将第一个参数 this 对象和后面的参数分离。

下面是步骤:

其中, slice 是 Array.prototype 上的方法,这块可以理解为将 arguments 这个类数组赋予数组的 slice 功能。

用 shift 方法将数组的第一项从数组中剔除,改变了原数组,返回了被剔除的这个数组~ 好,这下第一个参数有啦

为了方便,好看,把 this 赋值给变量 self 。这块的 this 就是指:谁调用的这个 bind1 ,就指向谁,比如一开始咱们的例子,如果 fn1 执行的话,就指向 fn1 。

结果我们是要输出绑定过的 this 函数,所以我们这里用 apply 方法,将之前获取的第一个this对象参数 t ,和后面的n个参数 args 传递进去,就是我们想要的结果啦。

检验一下:

bind函数需要再次调用