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

我们都知道 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是想等的,这就是原因 以上就是实例化对象的过程了

✏️ 如有问题,欢迎指正
上一篇 : 个人网站2.0版本总结个未来规划下一篇 : 对象的继承方式