new关键字执行过程
/**
构造函数执行的过程:
初始化作用域链
创建一个默认的对象(此对象就是当前对象的实例)
让上下文中的this指向此对象
初始化arguments
形参赋值
变量提升
代码执行
在没有返回值的情况下,默认会把创建的实例对象返回。如果retur的是基本类型值,返回的还是示例;
如果return的是引用数据类型,那么会替代返回的实例;
*/
const myNew = function(Func) {
// 创建一个对象实例,并且把Func作为当前对象的原型链,也就是说此对象是Func的实例
let obj = Object.create(Func.prototype)
// 获取其他参数
let args = [].slice.call(arguments, 1)
// 把类当作普通函数执行,此对象的this指向Func
let result = Func.apply(obj, args)
// 判断一下是否存在返回值,不存在或返回值类型,则返回实例对象;
// 存在返回值且为引用数据类型则返回当前返回值
return result instanceof Object ? result : obj
}