new

124 阅读1分钟

new

  • 创建一个空对象
  • 将它的引用赋给 this,继承函数的原型。
  • 通过 this 将属性和方法添加至这个对象
  • 将构造函数添加到原型上
  • 最后返回 this 指向的新对象,也就是实例(如果没有手动返回其他的对象)
/*
    fn:构造函数
    args :执行构造函数的输入参数
*/ 
function myNew(fn,...args){
    // 1.创建一个空对象
    const obj = {};
    // 2.改原型,将该对象的__proto__属性链接到构造函数的原型对象
    obj.__proto__ = fn.prototype
    // 4.将构造函数添加到原型上
    obj.__proto__.constructor=fn
    // 4.执行构造函数,将该对象作为this上下文调用构造函数并接收返回值
    const res = fn.apply(obj,args);
    // 5.返回新对象(需要判断构造函数返回值类型)
    return typeof res === 'object' ? res : obj;
}

构造函数返回值

传统语言中,构造函数不应该有返回值,实际执行的返回值就是构造函数的实例化对象。 js中构造函数可以有返回值,也可以没有返回值。

  • 没有返回值,返回实例化对象
  • 有返回值
    • 返回值是基本数据类型,返回实例化对象;
function f(){
    this.name='coco'
    //return 0
    //return '0'
    // return true
   // return null
   // return undefined
   // return Symbol('symbol')
    return 1n
}
let obj=new f()
  • 返回值是引用数据类型,返回引用类型。
function f(){

this.name='coco'

//return {name:'lily',age:1}
return ['coco',1]

}

let obj=new f()

参考资料