原型原型链
原型
显式原型
- 在js中,每个构造函数都有一个prototype属性,这个属性指向一个对象,这个对象包含了该构造函数所有实例上共享的一些属性和方法,这个prototype对象即为构造函数的显示原型。
隐式原型
- 在js中,每个实例对象都有一个内部的链接链接到其构造函数的原型对象上,这个链接即为__proto__,这个__proto__链接的对象即为这个实例对象的隐式原型。
二者关系
- 实例对象的隐式原型等于其构造函数的显示原型。
原型链
理解
- 在js中,每个对象都有一个原型对象,而这个原型对象又有自己的原型对象,这样层层向上追溯,就形成了一个链式结构,就形成了原型链。
作用
- 原型链的作用就是实现基于对象的继承机制,使得所有实例对象之间可以共享属性和方法。
原型链查找过程
- 当访问一个对象上的属性或方法时,先在该对象上查找
- 如果对象自身没有查找到这个属性或方法的时候,就会向原型链上查找,即查找该对象的原型,也就是__proto__指向的那个对象,如果还有查到就会向隐式原型的原型上继续查找。
- 在查找过程中,如果查找到直接使用,如果查找不到就继续查找,直到原型链的尽头,即Object.prototype为止,如果没有查到,返回undefined。
- 为什么到Object。prototype为止呢,是因为所有对象都继承自Object,所以它们的原型链最终都会指向Object.prototype。
闭包
闭包的定义
- 有权访问另外一个函数作用域中变量的函数
- 函数嵌套和访问了外部变量
闭包的应用场景
- 防抖
- 节流
- 自执行函数
闭包产生的问题
- 内存泄漏:当闭包中引用的变量一直存在,并且闭包本身又被其他对象或函数引用时,这些变量无法被垃圾回收机制回收,从而导致内存泄漏。
- 性能影响:闭包涉及作用域链的查找,相比普通函数,闭包的执行速度较慢。
如何解决
- 在不再需要闭包时,将其引用置为null,以便垃圾回收机制能够回收相关的内存空间。
- 避免不必要的闭包使用,确保只有在确实需要时才使用闭包。
事件循环
为什么要有异步?
因为js是单线程的,它运行在浏览器的渲染主线程中,而渲染主线程只有一个。
渲染主线程承载这诸多的工作,渲染页面和js的执行都在其中运行。
如果采用同步的方式,既有可能产生主线程阻塞,导致消息队列中其它任务无法得到执行,不行导致主线程白白耗时,也会导致页面无法及时更新,造成假死的情况。
所以只能采用异步,具体做法就是,当某些任务发生时,比如计时器,用户的操作,网络请求,事件监听等,主线程将这些任务交给其它线程去处理,当其它线程完成时将这些任务加入到消息队列的末尾,等待主线程的调度执行,在这样的模式下,浏览器就永不阻塞,从而最大限度的保证单线程的流畅执行。
什么是事件循环
浏览器在执行js的时候,主线程会不断执行代码,遇到同步任务直接执行,遇到异步任务,比如定时器,网络请求,用户交互操作,这类的请求就会被浏览器加到宏任务队列中,遇到promise的执行回调会被加到微任务队列中,主线程会开启一个无限循环,不断地查看任务队列中是否有任务存在,如果有任务,先执行微任务,在执行宏任务,每次执行下一次的宏任务之前都会先把微任务队列清空。
promise
promise解决的问题
promise就是解决了回调地狱的问题,为了拿到异步的结果,有时候需要层层回调,代码的可读性极差,promise就解决了这个问题。
promise有三个状态
- pending状态等待状态
- fulfilled状态异步处理成功就会变成这个状态
- rejected状态异步处理失败就会变成这个状态
- 而且promise成功后状态就不能改变了,如果成功了你后面在执行失败也是无效的,因为状态已经确定了
- 还有常用的方法,then()方法用来接收成功的结果,catch方法用来接收失败的结果,还有finally就是不管成功还是失败都会执行这个方法里面的回调函数。
promise的类方法
- Promise.resolve()方法在确定成功的时候可以直接使用,不用new Promise在执行成功的回调。
- Promise.reject()方法在要抛出错误的时候直接使用。
- Promise.all()方法可以传入多个promise,会返回一个新的promise来包裹多个promise,等多个promise全部是成功的状态的时候,就把新的promise状态变为fulfilled,并且返回一个数组,存放着多个promise的结果,如果有一个是失败的话,就把新的promise状态也变成rejected,变成失败的状态。
- Promise.race()方法是会返回最快执行的一个promise的结果,不管成功失败。
- Promise.any()方法是会返回一个最先执行的成功的promise
- Promise.allSettled是es11新出的方法,会等包裹的promise执行完返回包裹的proomise的每个状态和结果,是个数组对象。
promise可以取消不?
一旦开始执行就无法取消。