JS new的过程

153 阅读1分钟
  • 1:创建一个空对象
  • 2:设置该对象的__proto__属性为构造函数的原型对象
  • 3:修改构造函数内部this指针指向新创建的对象
  • 4:如果构造函数内部返回引用数据类型则返回构造函数中返回值,否则返回新的对象
function myNew(fn) {
    // 通过Object.create()创建新的对象并为新的对象设置__proto__属性为构造函数原型空间
    const newObj = Object.create(fn.prototype);
    // 获取传入函数中参数
    const args = [].slice.call(arguments, 1)
    // 修改构造函数的this指针为新创建的对象,
    const res = fn.apply(newObj, args)
    // 判断返回的结果是否为引用数据类型,
    if ((typeof res === 'object' && res !== null) || typeof res === 'function') {
        return res
    }
    return newObj
}
function Student(name, age) {
    this.myName = name
    this.age = age
}
myNew(Student,'lmh',20)