javascript中对象的“亲缘关系”本质是原型链的委托查找机制——对象通过__proto__逐级向上查找属性和方法,最终终止于null;它不是类继承的父子血缘,而是动态的、单向的属性访问委托链。

JavaScript 中对象的“亲缘关系”本质是原型链的委托关系——不是类继承的父子血缘,而是对象通过 __proto__(或 Object.getPrototypeOf())逐级向上查找属性和方法的一条链路。理解它,关键在于看清“谁的原型是谁”,而不是想象出一个家族树。
每个对象都有一个隐式原型(__proto__)
当你创建一个对象,无论用字面量、构造函数还是 class,它都会自动获得一个内部属性 [[Prototype]],在绝大多数环境中可通过 __proto__ 访问(规范不推荐直接使用,但用于理解很直观)。
-
const obj = {};→obj.__proto__ === Object.prototype -
const arr = [];→arr.__proto__ === Array.prototype -
function Foo() {}→const f = new Foo(); f.__proto__ === Foo.prototype
原型链是一条向上的查找路径,不是双向关系
“亲缘”只体现在属性访问时的**委托查找**:当读取 obj.x,JS 先查 obj 自身,没找到就去 obj.__proto__ 查,再没找到就继续查 obj.__proto__.__proto__,直到为 null(即 Object.prototype.__proto__ === null)为止。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 这就像孩子问父母不知道的问题,父母再去问爷爷,爷爷再问太爷爷……没人知道就作罢
- 不存在“obj 是 Object 的实例”这种静态归属判断,只有“obj 在查找时会经过 Object.prototype”这一动态行为
-
obj instanceof Constructor的原理就是:检查Constructor.prototype是否出现在obj的原型链上
函数的 prototype 属性只对 new 出来的实例生效
这是最容易混淆的一点:Function.prototype 和 func.prototype 完全不同。
-
function F() {}:F 是函数对象,它自己也有原型 →F.__proto__ === Function.prototype -
F.prototype是一个普通对象,默认有constructor: F,它只作为new F()所创建实例的__proto__ - 换句话说:
F.prototype是“后代”的原型,不是 F 自己的原型
现代写法中,class 只是语法糖,原型链逻辑不变
class 看似像传统面向对象,但底层仍是原型机制:
-
class B extends A {}→ 实际设置了B.prototype.__proto__ === A.prototype(让子类实例能访问父类原型方法) - 同时设置
B.__proto__ === A(让子类能继承静态方法) - 所有实例的原型链终点仍是
Object.prototype → null
原型链不是为了模拟现实亲属,而是实现轻量、动态的属性共享与复用。只要记住:每个对象有一个原型,原型本身也是对象(也有自己的原型),这条链最终终止于 null —— 理清这一条线,对象间的“关系”就自然浮现了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










