原型链是javascript用对象链接替代类继承的机制,通过__proto__逐级向上查找属性和方法,最终止于object.prototype;所有对象原型链终点均为object.prototype→null。

原型链的核心,是 JavaScript 用对象链接代替“类”的继承方式。它不靠定义模板,而是靠 一层层向上找 的查找过程来复用属性和方法。
prototype 和 __proto__ 是两条线,但连成一条链
每个函数(非箭头函数)都有一个 prototype 属性,它是一个对象,用来存放所有实例共享的属性和方法;
每个对象(除 null 外)都有一个 __proto__ 属性(推荐用 Object.getPrototypeOf() 访问),它指向创建该对象的构造函数的 prototype。
-
Person.prototype是构造函数的“共享仓库” -
person.__proto__ === Person.prototype是实例通往仓库的“门” - 这个“门”连着下一个“门”:比如
Person.prototype.__proto__ === Object.prototype
属性查找就是顺着 __proto__ 往上跳
当你读取 obj.xxx 时,引擎按顺序检查:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 先看
obj自身有没有xxx - 没有?就跳到
obj.__proto__上找 - 还没找到?再跳到
obj.__proto__.__proto__ - 一直跳到
Object.prototype—— 它的__proto__是null,停止查找,返回undefined
所有普通对象都落在同一条终点线上
无论你用 {}、[] 还是 new Date() 创建对象,它们的原型链最终都会汇入 Object.prototype:
-
{}→Object.prototype→null -
[]→Array.prototype→Object.prototype→null -
function() {}→Function.prototype→Object.prototype→null
继承的本质是手动延长这条链
想让 Dog 继承 Animal,关键是让 Dog.prototype 的 __proto__ 指向 Animal.prototype:
- 老写法:
Dog.prototype = new Animal() - 现代写法:
Object.setPrototypeOf(Dog.prototype, Animal.prototype) - ES6 类底层也是这么干的,只是语法更简洁
不复杂但容易忽略:原型链不是静态结构,运行时可以动态修改 prototype 或用 Object.setPrototypeOf() 调整 __proto__,整个链上的实例会立刻反映新行为。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










