JS进阶-各种手写原理 | 青训营笔记

88 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第3天
今天学习的内容是月影老师的js课程,学习到了模块化,组件化,学习之后对js的各种原理实现很感兴趣下面是自己模拟原理的实现

1.new的实现原理

  1. 在内存中创建一个新的对象
  2. 这个内存中对象的___proto__指向func的prototy属性
  3. 构造函数内部的this被赋值给这个新对象(this指向创造的实例)
  4. 执行构造函数的代码即给新对象添加属性
  5. 如果构造函数返回非空对象,返回该对象;否则返回新创建的对象(重点理解)
    下面来贴代码
function mynew(con,...args){
    let obj = object.create(con.prototype)//执行1 2 步
    const res = con.apply(obj,args)//执行 3 4 步
    return res instanceof object ? res : obj //5
}
function Person(name,age){
      this.name = name
      this.age = age
      }
 Person.prototype.say = function(){
 console.log(`name:${this.name},age:${this.age}`)
 }
 const p = mynew(Person,'jack',18)
 p.say()  //name:jack,age:18

2.promise.all的实现原理

  • Promise函数对象的all方法 返回一个promise对象,只有当所有promise都成功时返回的promise状态才成功
  • Promse.all在处理多个异步处理时非常有用,比如说一个页面上需要等两个或多个ajax的数据回来以后才正常显示,在此之前只显示loading图标。
Promise.myAll = function(promises){//参数为promise对象
	const values = new Array(promises.length)
	var resolvedCount = 0; //计状态为resolved的promise的数量
	return new Promise((resolve,reject)=>{
		// 遍历promises,获取每个promise的结果
		promises.forEach((p,index)=>){
			 Promise.resolve(p).then(
                value =>{
                    // p状态为resolved,将值保存起来
                    values[index] = value
                    resolvedCount++;   
                    // 如果全部p都为resolved状态,return的promise状态为resolved
                    if(resolvedCount === promises.length){
                        resolve(values)
                    }
                },
                reason =>{ //只要有一个失败 return的promise状态reject
                    reject(reason);
                })                         
        })
    })
}

3.实现Promise.race()

  • Promise函数对象的race方法 返回一个promise对象,状态由第一个完成的promise决定
Promise.myRace = function(promises){
    return new Promise((resolve,reject)=>{
        // 遍历promises,获取每个promise的结果
        promises.forEach((p,index)=>{
            Promise.resolve(p).then(
                value => {
                    // 只要有一个成功,返回的promise的状态就为resolved
                    resolve(value)

                },
                reason => { //只要有一个失败,return的promise状态就为reject
                    reject(reason)
                }
            )
        })
    })
}

4.实现instanceof

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上

判断某个实例对象的类型

原理: 顺着原型链一直向上查找,寻找实例对象的原型是否存在

        function myinstanceof(L,R)
        {
        let LP = L.__proto__
        let RP = R.__prototype__
        while(1){
        if(LP == null) return false
        if(LP == RP) return true
        LP = LP.__proto__  // 不符合继续向下查找
        }
        }

5.更多手写等待楼主以后时间多了会更新的。。。