构造函数、原型对象和实例对象通过prototype、constructor和__proto__形成闭环关系:构造函数的prototype指向原型对象,原型对象的constructor回指构造函数,实例对象的__proto__指向构造函数的prototype。

构造函数、原型对象和实例对象之间的关系,本质是 JavaScript 实现对象复用与继承的底层约定。它不是靠语法强制,而是靠三个固定指向形成的闭环结构。
构造函数 → 原型对象:通过 prototype
每个函数(包括自定义构造函数和内置函数如 Array)天生自带一个 prototype 属性,它是一个普通对象,由系统自动创建。这个对象就是该构造函数的“原型对象”。
-
Person.prototype就是Person构造函数的原型对象 - 你往
Person.prototype上添加方法或属性,所有后续用new Person()创建的实例都能访问到 - 这个设计避免了把方法重复塞进每个实例,节省内存
原型对象 → 构造函数:通过 constructor
原型对象默认带有一个 constructor 属性,它的值就是对应的构造函数本身。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Person.prototype.constructor === Person返回true - 这个回指让实例能“知道”自己是谁造出来的:
person1.constructor === Person - 如果用字面量方式重写整个
prototype(比如Person.prototype = { say() {} }),constructor会丢失,需要手动补上:constructor: Person
实例对象 → 原型对象:通过 __proto__
每个实例对象内部都有一个隐式链接,浏览器通常暴露为 __proto__(标准名称是 [[Prototype]]),它指向其构造函数的 prototype 对象。
-
const p = new Person()→p.__proto__ === Person.prototype - 这个链接决定了属性查找路线:访问
p.name先查实例自身,找不到就顺着__proto__找到原型对象上有没有 -
__proto__是非标准但广泛支持的属性,开发中不建议直接使用;应优先用Object.getPrototypeOf(p)
三者连起来就是一个闭环
你可以把它看作一个稳定三角:
- 构造函数用
prototype“抛出线”连向原型对象 - 原型对象用
constructor“拉回线”指回构造函数 - 实例对象用
__proto__“向上线”挂靠在原型对象上 - 任意一环断开(比如误删
constructor或覆盖prototype时没补),三角就失衡,可能影响 instanceof 判断或继承逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










