new操作符的实现原理
1、执行过程
-
1、首先创建一个新的对象,这个新对象的[[prototype]]属性指向构造函数的prototype属性
-
2、将构造函数的this指向这个对象
-
3、执行构造函数中的代码,一般是通过this给新对象添加新的成员属性或方法
-
需要补充说明的是:
-
普通函数一般都有return返回值,但构造函数默认不用return返回值;
-
在构造函数中,如果return的是简单数据类型,构造函数会忽略return的值,依然返回this对象。
-
如果return的是引用类型,构造函数返回return后面的值
2、具体实现
function achieveNew(){
//首先判断参数是否是一个函数
let constructor = Array.prototype.shift.call(arguments)
if(! constructor instanceof Function){
console.error("type error");
return
}
//判断参数是否是箭头函数
if(constructor.prototype == undefined){
console.error("type error");
return
}
//新建一个空对象,对象的原型为构造函数的prototype对象
let newObj = null
newObj = Object.create(constructor.prototype)
//将构造函数的this指向新创建的对象,并执构造函数
let result = null
result = constructor.apply(newObj,arguments)
//判断构造函数的类型
//如果是基础数据类型,直接返回newObj,如果是引用类型,则返回该值
//因为typeof会将null判断为'object',所以先判断result是否为null
if(result === null) return newObj
return typeof result === 'object'? result : newObj
}
//使用方法
achieveNew(构造函数,初始化参数)