原型是真实存在的对象,为属性和方法共享提供载体;几乎所有值(除原始类型外)通过__proto__链接到原型对象以获得公共行为,原型链终点为null。

JavaScript 中的“原型”不是抽象概念,而是真实存在的对象,是属性和方法共享的载体;所谓“万物皆对象”,本质是指几乎所有值(除原始类型外)都通过 __proto__ 链接到某个原型对象,从而获得公共行为——比如 toString()、hasOwnProperty() 等,它们并不属于你创建的对象本身,而是从原型链上“借来”的。
原型是一个真实可访问的对象
每个函数(非箭头函数)在定义时自动拥有一个 prototype 属性,它的值就是一个普通对象,称为“原型对象”。这个对象默认带有一个 constructor 属性,指回该函数本身。
-
function Person() {}→Person.prototype是一个对象,可直接添加方法:Person.prototype.say = function() {} - 用
new Person()创建的实例,其内部 __proto__ 自动指向Person.prototype - 所以
instance.__proto__ === Person.prototype返回true
“万物皆对象”的实际边界
严格来说,“万物皆对象”是简化说法。真正参与原型机制的是:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 所有引用类型:普通对象、数组、函数、正则、日期等,都有 __proto__
- 原始类型(
string、number、boolean、symbol、bigint)本身不是对象,但在访问属性时会临时包装为对应包装对象(如String),从而能调用toUpperCase()等方法 -
null和undefined没有原型,访问__proto__会报错
原型链的终点是 null
原型不是无限嵌套的,而是一条有明确起点和终点的链:
- 实例 → 构造函数的
prototype→Object.prototype→null -
Object.prototype.__proto__是null,这是整个链的终止信号 - 所有内置构造函数(
Array、Function、Date等)最终都继承自,因此共享 <code>toString、valueOf等基础方法
prototype 和 __proto__ 不是同一类东西
这是最容易混淆的两个属性,关键区别在于谁拥有它:
- prototype 只属于函数对象(包括 class),它是为将来可能创建的实例准备的“原型模板”
- __proto__ 属于所有对象(含函数),表示“我当前的原型是谁”,即运行时的委托目标
- 创建实例时,引擎自动把
实例.__proto__ = 构造函数.prototype - 推荐用
Object.getPrototypeOf(obj)替代obj.__proto__,更规范且兼容性更好
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










