对象的__proto__通常指向其构造函数的prototype,但Object.create(null)、手动修改__proto__或使用Object.setPrototypeOf()会破坏该关系;函数对象的__proto__均指向Function.prototype。

是的,绝大多数情况下,对象的 __proto__ 确实指向其构造函数的 prototype 属性所引用的对象。
这个关系成立的前提是:对象由 new 构造函数调用创建
例如:
-
function Person() {}定义后,new Person()创建的实例p满足:p.__proto__ === Person.prototype -
let arr = [](等价于new Array()),有:arr.__proto__ === Array.prototype -
let obj = {}(等价于new Object()),有:obj.__proto__ === Object.prototype
但存在明确的例外情况
以下情形会打破该对应关系:
-
使用
Object.create(null)创建的对象:它的__proto__是null,没有构造函数,自然也没有constructor.prototype -
手动修改了
__proto__:比如obj.__proto__ = someOtherObj,此时它不再指向原构造函数的prototype -
通过
Object.setPrototypeOf()设置原型:同样会覆盖默认的__proto__指向
特别注意 constructor 并不总可靠
obj.constructor 是从 obj.__proto__ 上沿原型链查到的属性,不是对象自身的。如果原型被重赋值(如 Foo.prototype = {}),constructor 可能丢失或指向错误函数,导致 obj.__proto__ !== obj.constructor.prototype。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
函数对象自身也遵循该规律
函数也是对象,所以它也有 __proto__。所有函数(包括内置和自定义)的 __proto__ 都指向 Function.prototype,因为它们本质上都是 Function 的实例:
-
function foo() {}→foo.__proto__ === Function.prototype Array.__proto__ === Function.prototypeObject.__proto__ === Function.prototype
本质上,__proto__ 描述的是“我由谁构造出来、继承自哪里”,而 constructor.prototype 是那个“源头模板”。只要没被显式干预,这条链就保持一致。

















