new 做了什么?

首先,我们需要知道什么是构造函数?
我的理解,构造函数就是一个用来生成拥有一系列相同属性和方法的对象的方法。

   function Person(name,age){
          this.name=name;
          this.age=age;
}
Person.prototype.show=function(){
        console.log("我是"+this.name,"我的年龄"+this.age)
}
const p1=new Person("小明","18岁");
p1.show() // 我是小明 我的年龄18岁

   function Person(name,age){
          this.name=name;
          this.age=age;
}
Person.prototype.show=function(){
        console.log("我是"+this.name,"我的年龄"+this.age)
}
当我们new一个构造函数的时候,我们相当于做了一下几步
const p1={}  // 1.定义一个对象。
p1.__proto__ = Person.prototype; // 2. 把p1的原型链指向Person.prototype;这样p1这个对象就拥有了show方法。
Person.call(p1,"小明","18岁"); // 调用构造函数,初始化对象p1的属性
p1.show() // 我是小明 我的年龄18岁

然后我们接着探索 如何自己实现一个new关键字。
通过一个函数realizeNew来模拟new关键字的作用。
比如我们写

  const p1=new Person("小明","18岁");
//  等同于写
   const p1=realizeNew(Person,"小明","18岁");

很容易想到应该这样实现

   function Person(name,age){
          this.name=name;
          this.age=age;
}
Person.prototype.show=function(){
        console.log("我是"+this.name,"我的年龄"+this.age)
}
  function realizeNew(){
    console.log(arguments);
    const Fn =arguments[0];
    const p = {};
    p.__proto__ = Fn.prototype;
    Fn.apply(p,[...arguments].slice(1));
    return p
  }
  const p1=realizeNew(Person,"小明","18岁");
  p1.show();

你可能感兴趣的:(new 做了什么?)