JavaScript对象的__proto__指向其构造函数的prototype,形成基于委托的原型链而非类继承;__proto__是对象属性,prototype是函数属性;推荐用Object.getPrototypeOf()等标准API替代__proto__。

JavaScript 中对象的 __proto__(隐式原型)指向其构造函数的 prototype 对象,而不是“父级”这个概念本身——JS 没有传统面向对象语言中的类继承意义上的“父类”,而是基于原型链的委托机制。
__proto__ 的指向规则
每个对象(除 null)都有一个 __proto__ 属性,它是一个访问器属性,内部关联着该对象的原型对象。它的值由对象创建方式决定:
- 通过字面量创建(如
{}或[]):{}.__proto__ === Object.prototype,[].__proto__ === Array.prototype - 通过构造函数创建(如
new Foo()):(new Foo()).__proto__ === Foo.prototype - 通过
Object.create(parent)创建:obj.__proto__ === parent(显式指定原型)
原型链是怎么形成的
__proto__ 的作用是把对象连成一条链,查找属性时按链向上委托。比如:
function Animal() {}
Animal.prototype.eat = function() { console.log('eating'); };
function Dog() {}
Dog.prototype = Object.create(Animal.prototype); // 关键:让 Dog.prototype 继承 Animal.prototype
Dog.prototype.constructor = Dog;
const dog = new Dog();
dog.eat(); // ✅ 找到 → dog.__proto__ (Dog.prototype) → Dog.prototype.__proto__ (Animal.prototype) → 找到 eat
这里 dog.__proto__ 指向 Dog.prototype,而 Dog.prototype.__proto__ 指向 Animal.prototype,就构成了两级原型链。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
别混淆 __proto__ 和 prototype
这是最易错的地方:
-
__proto__是对象身上的属性,指向它的原型对象(即“它从哪来”) -
prototype是函数身上的属性,仅用于当该函数作为构造函数时,为实例对象提供__proto__的默认指向 -
obj.__proto__ === Constructor.prototype是创建实例后的结果,不是定义时的等价关系
现代写法推荐用 Object.getPrototypeOf()
__proto__ 是非标准但广泛支持的访问器,已不推荐直接赋值(如 obj.__proto__ = ...)。应使用标准 API:
- 读取原型:
Object.getPrototypeOf(obj)(等价于obj.__proto__) - 设置原型:
Object.setPrototypeOf(obj, proto)(替代obj.__proto__ = proto) - 创建带指定原型的对象:
Object.create(proto, descriptors)
这样更安全、语义更清晰,也便于静态分析和优化。

















