构造函数返回值与new实例关系

166 阅读1分钟
如果函数返回 return {},return null,return undefined,return 1,return true,return Symbol()会发生什么

代码实验

console.table([null,undefined,1,true,Symbol(),{a:1},[1,2]]
//制造构造函数
//创建构造函数工厂
.map((item)=>[item,function(){return item}])
//实例化
.map(([res,myConstructor])=>[Object.prototype.toString.call(res),res,new myConstructor()])
)

b7e4ca5acfd40037ec51acf2fe8b29c.png

模拟构造函数实现

function Person(name){
    this.name=name
}
Person.prototype.say=function(){
  console.log(`my name is ${this.name}`)
}

const person=new Person('张三')
person.say()
function myNew(fn,...args){
    const obj={}
    obj.__proto__=fn.prototype
    const res=fn.apply(obj,args)
    //改步骤也可以看出当类型为object是返回引用类型本身,如果不是返回上面创建的空对象
    return typeof res ==='object' ? res :obj
}
const persons=myNew(Person,'李四')
persons.say()

结论

  • 基本类型返回空对象
  • 引用类型返回引用类型

面试攻略

  • 基本类型返回空对象
  • 引用类型返回引用类型