简单理解new干了什么

58 阅读1分钟

你有对象嘛?要不new一个吧!大家喜欢这么开玩笑。那new到底干了些什么呢?

  • 将构造函数的原型prototype绑定到返回对象的隐式原型__proto__上
  • 执行构造函数时会把this绑定到返回的对象上
  • 判断执行完构造函数后的返回值是否为对象,是的话直接返回,否则返回生成对象

代码如下

function myNew(fn,...params){
    let newObj = {}      
    Object.setPrototypeOf(newObj,fn.prototype)  //将构造函数的原型prototype绑定到返回对象的隐式原型__proto__上
    let resOut = fn.apply(newObj,params) //   执行构造函数时会把this绑定到返回的对象上
    return typeof(resOut) === 'object'?resOut:newObj //判断执行完构造函数后的返回值是否为对象,是的话直接返回,否则返回生成对象
}
function Person(name,age){
    this.name = name
    this.age = age
}
Person.prototype.school = '学校'
let person1 = myNew(Person,'小王',20) 
console.log(person1);   // Person { name: '小王', age: 20 }
console.log(person1.school);  //学校

这样就可以实现new了,那new的左作用是啥呢,就是通过原型来实现继承,在构造函数上定义的字段school,那么通过new生成的实列可以通过原型_proto_来进行访问。