实例的 proto 指向构造函数的 prototype,二者是值相等的对象引用关系;prototype 是构造函数独有的属性,__proto__ 是所有对象共有的内部原型链指针。

构造函数的 prototype 和实例的 __proto__ 在 JavaScript 中**不是“等价”的概念,而是存在明确指向关系的对象引用**。准确地说:实例的 __proto__ 属性值,等于其构造函数的 prototype 属性值。
为什么说它们“相等”但不“等价”
“等价”容易让人误以为二者是同一属性或可互换使用,但实际上:
-
prototype是函数(包括构造函数)独有的属性,它是一个对象,用于定义所有实例共享的属性和方法; -
__proto__是每个对象(包括函数、数组、普通对象等)都有的内部属性(标准名为[[Prototype]]),它指向该对象的原型对象; - 这个指向关系是在
new过程中被设定的——new创建实例时,会自动把该实例的__proto__设置为构造函数的prototype。
关键代码验证
以下代码能清晰体现这种指向关系:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function Person(name) {
this.name = name;
}
const p = new Person('Alice');
console.log(p.__proto__ === Person.prototype); // true
console.log(Person.prototype.constructor === Person); // true
console.log(p.constructor === Person); // true(继承自 prototype)
注意:p.constructor 并非 p 自身定义的属性,而是通过 p.__proto__(即 Person.prototype)查找到的。
常见误解澄清
容易混淆的点往往出现在以下情况:
-
普通对象没有
prototype:比如const obj = {},obj.prototype是undefined,但它有__proto__(指向Object.prototype); -
函数既有
prototype又有__proto__:因为函数本身是对象,所以它作为对象有__proto__(指向Function.prototype),同时作为构造函数又有prototype; -
__proto__不是标准写法,推荐用Object.getPrototypeOf()获取原型,避免兼容性与语义问题。
一句话总结
实例的 __proto__ 指向构造函数的 prototype,这是 JavaScript 原型继承机制的基石,也是属性查找(沿着 __proto__ 链向上)得以工作的前提。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










