JavaScript 对象与原型继承
对象是 JavaScript 里几乎一切复合数据的载体——数组、函数、类实例、Map、Date,底层都是对象。而把这些对象串成一张「谁能用谁的方法」的关系网的,是 JavaScript 独有的原型链:没有类,只有对象指向对象。本叶从对象字面量这一最朴素的形态出发,一路讲到属性描述符、引用与拷贝、[[Prototype]] 与原型链、基于原型的继承模式,最后落到 Object 静态方法这套日常工具箱——把「对象到底是什么、属性怎么查找、继承怎样发生」讲透。
概述
- 它管什么:怎样创建对象、怎样读写与删除属性、属性除了值还携带哪些「开关」(可写 / 可枚举 / 可配置)、对象之间怎样通过
[[Prototype]]共享行为、怎样把一个对象「继承」自另一个。 - 为什么值得认真学:JavaScript 的对象模型与 Java / C++ 的「类即蓝图」完全不同——
class只是原型机制的语法糖。不懂原型链,就解释不了「为什么[].push能用」「为什么改了Array.prototype全世界数组都变」「为什么for...in会枚举出意料之外的键」。同时,引用语义、浅拷贝陷阱、Object.freeze的「浅冻结」这些坑,几乎每个项目都会踩。 - 现代化关注点:
structuredClone()(原生深拷贝,2022 起广泛可用)、Object.hasOwn()(取代hasOwnProperty调用,2022 起广泛可用)、Object.fromEntries()(与Object.entries互逆)、Object.create(null)(无原型的纯字典对象)、以及「优先用class/Object.create,避免运行时Object.setPrototypeOf触发引擎去优化」的性能共识。
本叶地图
- 入门 —— 用一张「对象全景」把字面量、属性、原型、静态方法串起来,逐块指向后续深页
- 对象基础 —— 对象字面量、点 vs 方括号、
in、delete、计算属性名、简写与方法 - 属性描述符 ——
writable/enumerable/configurable三标志、getter/setter、freeze/seal - 引用与拷贝 —— 引用 vs 值、浅拷贝 vs 深拷贝、
structuredClone、循环引用 - 原型链 ——
[[Prototype]]、Object.create、__proto__vsprototype、属性遮蔽、查找规则 - 基于原型的继承 —— 构造函数 +
prototype、寄生组合继承的来龙去脉、class如何落到原型 - Object 静态方法 ——
keys/values/entries/assign/fromEntries/hasOwn与遍历选型 - 参考 —— 速查表 + 标准 / Baseline / MDN 链接
文档地址
- MDN: Working with objects(指南)
- MDN: Inheritance and the prototype chain(指南)
- javascript.info: Prototypal inheritance
- javascript.info: Property flags and descriptors