持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情
new的原理
在js中我们往往使用new关键字来生成一个对象类型的实例
生成的实例需要具有对象类型的属性以及原型链上的函数方法,并且是一个新返回的对象实例。在new中就需要创建一个新对象,并使其原型链链接到构造函数的原型对象上。最后就是通过apply方法来让构造函数以新对象执行,获取返回值并且判断是否为一个不为null的对象,如果是不为null的对象就返回构造函数返回对象,不然就返回新对象
function obj(){
//获取构造函数
var Constructor = [].shift.call(arguments)
//生成构造函数原型链上的新对象
var obj = Object.create(Constructor.prototype)
//执行构造函数并获取返回值
let res = Constructor.apply(obj,arguments)
return typeof res ==='object'?res||obj:obj
}
事件循环
js是一种单线程且非阻塞脚本语言
js是一种用来操作浏览器的脚本语言,因为这个原因,js是一种单线程的语言,因为如果多线程的话可能就会出现一个线程操作dom,另一个线程删除dom的情况,所以为了避免这种情况js成了一种单线程语言。
那单线程语言怎么处理异步任务才能保证脚本执行过程不会被阻塞。这就需要说到js的事件循环机制了。
js执行过程中会采用栈的存储结构将当前代码的执行上下文加入栈中,当其执行结束后就会将其出栈销毁。在这个代码的执行过程中如果遇见异步任务就会将其回调函数加入一个名叫事件队列的存储结构中等待。
而异步任务又区分宏任务和微任务,setInterval和setTimeout就属于宏任务,而promise.resolve.then则属于微任务。异步任务分为宏任务和微任务,事件队列也分为两种,每当执行栈被清空之后就会开始处理微任务队列中的任务,一直到微任务队列被完全清空之后,才会又开始处理宏任务队列里面的任务,在一个宏任务执行完成之后如果在此期间又有微任务产生则又会处理微任务队列,直到队列被清空,才会开始处理下一个宏任务。