new 一下到底发生了什么?

306 阅读1分钟

我们经常说没有对象就new一个,说明通过new我们可以创建出一个对象。那在这个过程中还发生了什么呢? 今天我们就来聊一下这个过程,首先我们定义一个构造函数:

function Person(name, age) {
  this.age = age;
  this.name = name;
  this.show = function () {
    console.log('show');
  };
}
Person.prototype.eat = function () {
  console.log('我会吃');
};

然后我们new一下这个构造函数: new Person()

上面代码总共会实现以下内容:

1、创建一个构造函数

2new一个实例对象

3、实例对象拿到构造函数中的属性

4、实例对象可以调用构造函数原型中的方法。

接下来我们来详细拆分一下这里面的细节:

  • 首先定义一个对象 obj var obj = {}

    我们打印一下这个对象到底长啥样:其实它就是一个普通的函数对象,构造函数指向了Object

image.png

  • 将这个对象的原型指向构造函数的原型对象空间上 obj.__proto__=Person.prototype

    此时他已经继承了构造函数的原型对象的方法和属性,但是构造函数上的属性和方法还是拿不到。

image.png

  • 最后一步就是这个this指向问题

    我们将Person函数对象的this指针替换成obj,然后再调用Person函数,于是我们就拿到了构造函数上的所有属性和方法了。到这一步我们就实现了。

image.png