实例的 proto 指向构造函数的 prototype,是 new 操作自动建立的固定链接;__proto__ 是实例的“向上找路”,决定属性查找路径;prototype 是构造函数的“共享仓库”,供所有实例通过原型链共享方法。

实例对象的 __proto__ 指向构造函数的 prototype,这是 JavaScript 原型机制最核心的一环。不是“桥梁”,而是 new 操作自动建立的固定链接。
__proto__ 是实例的“向上找路”
每个对象(除 null)都有 __proto__,它是一个内部指针,决定属性和方法从哪里开始查找。当你访问 p1.sayHello(),而 p1 自身没有这个方法时,引擎就顺着 p1.__proto__ 去找 —— 这个指针恰好指向 Person.prototype。
-
p1.__proto__ === Person.prototype→ 总是 true(只要p1是用new Person()创建的) - 修改
p1.__proto__只影响p1自己的查找路径,不会波及其他实例 - 推荐用
Object.getPrototypeOf(p1)替代__proto__,更标准、更安全
prototype 是构造函数的“共享仓库”
prototype 是函数才有的属性,它本身是个普通对象,默认带一个 constructor 指回该函数。所有通过该构造函数创建的实例,都靠 __proto__ 共享这个仓库里的内容。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Person.prototype.sayHello = function() {...}→ 所有Person实例都能调用,不重复创建 - 给
Person.prototype添加新方法,已有实例立刻可用(无需重新 new) - 函数的
prototype不是为自身服务,而是为它的实例准备的
它们不是双向同步的两个配置项
很多人误以为修改一边会“同步”另一边,其实完全独立:
- 改
Person.prototype.name = 'default'→ 所有未设置name的Person实例读取到 'default' - 改
p1.__proto__ = { sayHi() {} }→p1断开与Person.prototype的联系,其他实例不受影响 - 改
Person.prototype.constructor→ 只影响Person.prototype上的 constructor,不影响p1.constructor的值(它仍通过原型链找到)
一句话理清关系
new Person() 时,JavaScript 内部做了两件事:
① 创建空对象 p1;
② 把 p1.__proto__ 设置为 Person.prototype。
从此,p1 就能沿着这条线,复用 Person.prototype 上定义的一切。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










