单手一个八拍,带你实现new操作符 ~skr skr

new 都做了哪些事?

    1. 创建了一个新对象
    1. 将新对象的 proto属性 连接到 构造函数的原型 prototype,
    1. 调用一次函数 并且将this该为指向新创建的对象, 传入参数 判断返回值
    1. 如果构造函数无返回值,或者不是引用类型,返回新对象即可;否则为 构造函数的返回值。
    function myNew(func) {
        let res = {}; // 1. 创建一个新对象
        if (func.prototype !== null) {
        res.__proto__ = func.prototype; // 2.将构造函数的原型对象指向  新对象的原型 属性
    }
        let ret = func.apply(res, Array.prototype.slice.call(arguments, 1)); // 3. 将构造函数的 this 指向新创建的对象,并调用构造函数
        if ((typeof ret === "Object" || typeof ret === "Array") && ret !== null) { // 如果构造函数有返回值且是引用类型, 将它返回, 否则返回新对象
        return ret
        }
        return res
}

你可能感兴趣的:(单手一个八拍,带你实现new操作符 ~skr skr)