1.写在前面
在面试时,手撕代码的时候,面试官主要想考察的是对这个方法的理解是否到位?手撕的过程中,应该对原方法进行适当的拆解,有以下几个步骤:
- 原方法的接收参数是什么?
- 原方法的返回值是什么?
- 使用原方法时,它的主要功能是什么?都用到了哪些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);
结果
以上就是整个new的实现过程 小小知识又增长了哈~
happy day!