javaScript高级进阶

97 阅读1分钟

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
}