javascript对象模型基于原型而非类,对象通过[[prototype]]链查找属性,所有对象最终都指向object.prototype。

JavaScript 的对象模型本质上是基于原型的,不是基于类的。理解这一点,原型链就不再是抽象概念,而是你每天操作对象时背后真实发生的查找路径。
对象没有“类型”,只有“原型指向”
在 JavaScript 中,不存在“实例属于某个类”这种关系。一个对象之所以能用 toString() 或 hasOwnProperty(),不是因为它“是 Object 的实例”,而是因为它的 [[Prototype]] 链最终连到了 Object.prototype。
- 每个对象内部都有一个隐藏链接
[[Prototype]](可通过Object.getPrototypeOf(obj)安全读取) - 这个链接指向另一个对象——它的原型,而不是一个“类定义”
- 函数也有
prototype属性,但那只是为将来用new创建的对象准备的原型模板,和自身原型无关
属性访问就是一次原型链遍历
当你写 obj.name 或 arr.push(),引擎做的不是“查类型表”,而是按固定顺序逐级查找:
- 先检查
obj自身是否有name属性(自有属性) - 没有?就去
obj.__proto__(即Object.getPrototypeOf(obj))上找 - 还没找到?继续查
obj.__proto__.__proto__,也就是Object.prototype - 再往上是
null,查找终止,返回undefined
例如:[1,2].toString() 实际调用的是 Array.prototype.toString,而 Array.prototype.__proto__ === Object.prototype,所以它也能用 Object.prototype.valueOf。
构造函数只是“设置原型的快捷方式”
function Person() {} 本身不定义“类”,它只是个普通函数;new Person() 的关键动作是:创建空对象,并把它的 [[Prototype]] 指向 Person.prototype。
-
Person.prototype是一个普通对象,默认带constructor属性 -
const p = new Person()→Object.getPrototypeOf(p) === Person.prototype - 你可以完全绕过函数,用
Object.create(animal)直接指定原型,效果等价
所有对象共享同一套顶层原型结构
无论你用字面量 {}、new Date() 还是 class Foo{},它们的原型链终点都是统一的:
{} → Object.prototype → nullnew Date() → Date.prototype → Object.prototype → nullclass C{}; new C() → C.prototype → Object.prototype → null
这意味着 Object.prototype 上的方法(如 hasOwnProperty、isPrototypeOf)对一切对象都可用——不是因为“继承自 Object”,而是因为所有对象的原型链都经过它。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











