所属板块:3. 原型与面向对象(OOP)
记录日期:2026-03-xx
更新:遇到原型链查找或 __proto__ 相关题时补充
1. 原型机制:JS 对象之间最核心的“血脉纽带”
JavaScript 没有真正的“类”(Class-based),它从诞生起就是基于原型(Prototype-based) 的语言。
所有对象之间通过原型链实现属性和方法的共享(委托机制),这就是 JS 面向对象的底层齿轮。
记住:原型不是为了继承而存在,而是为了“共享内存”而存在。
理解了原型,就等于看懂了 JS 对象如何高效复用代码。
2. 三个最容易混淆的核心概念(原型三角关系)
-
显式原型
prototype- 只有函数才拥有(箭头函数除外)
- 本质是一个普通对象,用于存放将来实例要共享的属性和方法
- 默认自带一个
constructor属性,指向构造函数本身
function Person() {} console.log(Person.prototype); // { constructor: Person } Person.prototype.say = function() { ... }; -
隐式原型
__proto__(内部插槽[[Prototype]])- 所有对象(包括函数)都拥有
- 指向创建该对象的构造函数的
prototype - 标准访问方式:
Object.getPrototypeOf(obj)/Object.setPrototypeOf(obj, proto) __proto__只是浏览器历史遗留访问器,不推荐直接操作
const p = new Person(); console.log(p.__proto__ === Person.prototype); // true -
构造器
constructor- 位于原型对象上,反向指向关联的构造函数
- 容易被重写或丢失(继承时一定要手动修复)
console.log(Person.prototype.constructor === Person); // true
原型三角关系图(脑内必背):
3. 原型链(Prototype Chain)查找机制
当访问一个对象的属性时,JS 引擎会按以下顺序查找(“顺藤摸瓜”委托机制):
- 先在实例自身属性里找(Own Property)
- 找不到 → 顺着
__proto__去原型对象找 - 再找不到 → 继续顺着原型的
__proto__找 - 直到
Object.prototype.__proto__ === null(原型链终点)
这就是属性屏蔽(Property Shadowing):
function Person() {}
Person.prototype.name = "默认姓名";
const p = new Person();
p.name = "张三"; // 实例自身属性屏蔽了原型上的 name
console.log(p.name); // "张三"(就近原则)
4. 原型链的终点与常见误区
- 所有对象的原型链最终都指向
Object.prototype Object.prototype.__proto__ === null(绝对终点,查找停止)- 常见误区:
- 以为
__proto__是原型本身(错!它是链接指针) - 以为所有函数都有
prototype(箭头函数没有) - 直接修改
__proto__(会破坏性能和规范)
- 以为
5. 小结 & 复习时的“血脉视角”
- 画出原型三角关系图 + 原型链查找路径,是理解整个板块的基础
- [3-1] 的原型机制 + 接下来的 [3-2] 对象创建 & new 操作符,共同构成了 JS 面向对象的核心骨架
- 遇到“属性从哪来的”“为什么能调用 toString()”这类题,第一反应就是顺着原型链往上找
下一篇文章会进入 [3-2]:对象的缔造者(对象创建模式演进 + new 操作符底层四步曲 + 手写 myNew)。
返回总目录:戳这里