javascript 的对象设计以原型、函数和动态特性为核心,封装依赖闭包或私有字段,继承基于原型链,多态通过运行时方法查找实现,三者协同构建可维护可扩展的对象结构。

JavaScript 中的对象设计不是照搬 Java 或 C++ 的语法,而是围绕原型、函数和动态特性展开的。封装、继承、多态这三大特性在 JS 里有自己自然、轻量又灵活的实现方式——不靠关键字强制约束,而靠作用域、原型链和运行时行为来达成。
封装:用作用域和约定控制访问边界
JS 没有原生的 private 关键字(ES2022 起支持 # 私有字段,但兼容性需留意),所以封装更依赖“机制+约定”:
- 用 闭包 创建真正的私有状态:构造函数内声明变量,只通过返回的方法暴露读写接口
- 用 Symbol 或 下划线前缀(如
_internalId)标记“不应直接访问”的属性,这是广泛接受的语义约定 - ES6 类中可用
#balance定义私有字段,外部无法访问,连in操作符和Object.getOwnPropertyNames都查不到 - getter/setter 不仅是语法糖,更是插入验证逻辑的自然位置,比如检查年龄是否在合理范围
继承:原型链是底层,class 是语法糖
ES6 的 class 和 extends 让继承看起来像传统 OOP,但本质仍是基于 prototype 的委托机制:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
class Dog extends Animal会自动设置Dog.prototype.__proto__ === Animal.prototype - 子类构造函数中必须调用
super(),否则无法访问this—— 这是在模拟父类初始化逻辑 - 想复用父类方法又做定制?在子类方法里用
super.methodName()显式调用 - 避免直接修改
__proto__或用过时的Dog.prototype = new Animal(),推荐Object.create(Animal.prototype)或直接用extends
多态:方法重写 + 动态绑定,无需声明
JS 天然支持多态,因为方法调用始终在运行时解析,只要对象有同名方法,就能响应相同调用:
- 不同类的实例调用
.render(),各自执行不同的渲染逻辑,使用者无需关心具体类型 - 子类重写父类方法后,通过父类引用调用仍走子类实现 —— 原型链查找机制保证了这一点
- 函数参数不校验类型,所以一个处理函数可以接收
Button、Input、Modal等任意带.show()方法的对象 - 配合鸭子类型(duck typing),多态更轻量:不问“是不是 Animal”,只问“能不能
speak()”
不复杂但容易忽略:封装靠闭包或私有字段守住数据边界,继承靠原型链建立行为复用关系,多态靠运行时方法查找实现行为差异。三者不是割裂的,而是一起支撑起可维护、可扩展的对象结构。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










