javascript面向对象本质是基于原型链的对象委托机制,通过[[prototype]]隐式链接实现动态属性查找与行为共享,class仅为语法糖。

JavaScript 的面向对象编程本质不是靠“类”,而是靠对象之间的委托关系——原型链就是实现这种委托的机制。它不强调模板复用,而强调行为共享与动态查找。
原型链是对象间的行为委托链
每个对象内部都有一个隐式链接 [[Prototype]](通常通过 __proto__ 访问),指向它的原型对象。当访问一个属性或方法时,若当前对象没有,就顺着这个链接向上找,直到找到或抵达终点 null。这不是复制,也不是继承“结构”,而是运行时的“委托查询”。
- 函数创建时自动拥有 prototype 属性,它是一个对象,供实例共享方法
- 用 new 创建的实例,其 __proto__ 自动指向构造函数的 prototype
- 所有普通对象最终都连到 Object.prototype,它的 __proto__ 是 null
面向对象的核心能力由原型链天然支撑
传统 OOP 关注封装、继承、多态,而 JavaScript 用原型链以更轻量的方式达成:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 封装:属性可定义在实例上(私有),方法挂载在原型上(共享)
-
继承:不是子类继承父类,而是子构造函数的 prototype 指向父构造函数的实例(如
Dog.prototype = Object.create(Animal.prototype)) - 多态:子原型重写同名方法即可覆盖查找路径,无需关键字修饰
class 只是原型链的语法糖
ES6 的 class 看似像 Java,但底层完全基于原型链:
-
class Person实际生成一个函数,Person.prototype依然存在 -
extends实际设置子类 prototype.__proto__ 指向父类 prototype -
super()本质是调用父构造函数,并确保 this 正确绑定
理解原型链能避开常见误区
很多“奇怪行为”其实源于对原型链查找机制的忽略:
- 修改 prototype 上的方法,所有已有实例立即生效(动态性)
- 用
for...in遍历时会遍历原型链上的可枚举属性,需配合hasOwnProperty()过滤 - 直接给实例赋值同名属性(如
obj.name = 'x'),会屏蔽原型上的name,但不会修改原型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










