手撕代码:new的实现

1.写在前面

在面试时,手撕代码的时候,面试官主要想考察的是对这个方法的理解是否到位?手撕的过程中,应该对原方法进行适当的拆解,有以下几个步骤:

  1. 原方法的接收参数是什么?
  2. 原方法的返回值是什么?
  3. 使用原方法时,它的主要功能是什么?都用到了哪些JS知识实现的

2.new的时候发生了什么

我们知道,使用new主要是用来创建一个对象,new Func(a,b,c),有构造函数,有传入的参数。那么在new的时候,主要做了一些什么事情呢?

  • 创建一个空的对象
  • 将对象的原型链接到构造函数的原型上面
  • 将构造函数中的this指向这个对象,执行构造函数的代码,完成初始化的工作
  • 判断返回值的类型,这里主要是和构造函数的返回值有关系

3.实现

注意: 对于构造函数的返回值,

  • 如果构造函数中没有return语句,则默认返回的是undefined;
  • 如果return的是基本数据类型的值,那么new,还是得到对象
  • 如果是对象或者函数,使用new创建的时候,会返回这个对象或者函数

代码

function myNew(){
        let obj=null;
        let constructor=Array.prototype.shift.call(arguments);
        let result=null;
        if(typeof constructor!="function"){
            console.error("第一个参数为函数类型");
            return;
        }
        // 通过原型对象创建原型
        obj=Object.create(constructor.prototype);
        // 这里返回的是undefined,因为构造函数并没有返回值,默认返回的是undefined
        result=constructor.call(obj,...arguments);
        // 判断返回对象是否是基本数据类型
        let flag=result && (typeof result==="object" || typeof result === "function");
        // new的返回的依据:如果构造函数的返回值不为function或者object类型,则返回对象,否则返回构造函数的返回值
        return flag?result:obj;
}

测试

function func(name,age){
        this.name=name;
        this.age=age;
        this.say=function(){
                console.log(this.name);
        }
}
let ob=myNew(func,123,3231);
console.log(ob);

结果

image.png

以上就是整个new的实现过程 小小知识又增长了哈~

happy day!