对象实例化的时候经历了什么?

我们都知道js是浏览器端的脚本语言,基本上大多数语言就是面向对象的编程模式,javascript也是有这类编程模式(OOP),一切皆为对象,而这种场景适用于组件的封装,以及很多场景,比如,如果我想写一个dog的构造函数,那我们需要继承于动物的父类,也叫做基类,但是呢今天我们不说对象的继承,单纯的说说对象的实例化

就拿时间对象 Date来说,我们在想获取当前的时间信息的时候需要

1
const date = new Date()

此时我们可以调用Date.prototype上的各种属性和方法

1
2
date.getTime()
date.getFullYear()

实例化完成之后,date就是Date对象的实力,判断一个变量是否是某一个对象的实力

1
date instanceof Date   // true

也就是说date.proto属性指向Date.prototype

1
date.__proto__ === Date.prototype   // true

如果我们还要实例化一个对象

1
2
3
const date1 = new Date()
date === date1 // false
date.__proto__ === date1.__proto__ === Date.prototype // true

由于this的指向不同,date 并不等于 date1
但是,他们走了同样的实例化步骤

  • 实力化的时候,会创建一个新的对象 {}
  • 将构造函数的this的值赋给新的对象,也就是this的指向指向新的对象
  • 在构造函数内执行代码,constructor的初始化,也就是 new Object() 括号里的参数内容,设置对象的自定义属性和方法
  • 设置新对象的proto属性指向构造函数的prototype对象
  • 返回一个新对象

所以我们发现两个实例化的对象不相等,但是实例化的对象的proto是想等的,这就是原因
以上就是实例化对象的过程了