JavaScript面向对象三大特征是封装、继承、多态:封装靠作用域和#私有字段隐性保护数据;继承通过原型链和call实现能力复用;多态依赖鸭子类型,同一方法名在不同对象中动态响应。

JavaScript 中理解面向对象的三大核心特征——封装、继承、多态,关键在于抓住它们各自解决的实际问题,而不是死记语法形式。JS 实现方式和 Java/C++ 不同,没有 class 关键字的强制访问控制,但思想完全一致。
封装:用结构和约定守住数据边界
封装不是靠 private 关键字,而是靠作用域和设计习惯实现的“隐性保护”。
- 把数据(如 age、salary)定义在函数内部(用 var/let 声明),外部就无法直接访问
- 把方法挂到 this 上(如 this.getName = function() {...}),就成了公开接口
- 用 prototype 添加的方法不能访问构造函数内的私有变量,这反而强化了封装边界
- 现代写法中,# 私有字段(如 #age)已进入标准,可真正限制外部读写
继承:靠原型链实现能力复用
JS 没有 extends 的类继承语法(ES6 class 是语法糖),本质是通过 __proto__ 和 prototype 链接对象与构造函数。
- 子构造函数内部调用父构造函数(如 Parent.call(this, ...))可复用初始化逻辑
- 设置 Child.prototype = Object.create(Parent.prototype) 可共享父类方法
- ES6 class 继承背后仍是这套机制,super() 就是调用父构造器 + 设置原型链
- 所有实例共享 prototype 上的方法,节省内存,也体现“共性抽取”的设计意图
多态:同一调用,不同响应
多态在 JS 中天然存在,不需要接口或抽象类,只要方法名相同、行为不同,运行时自动决定执行谁。
立即学习“Java免费学习笔记(深入)”;
- 比如 animal.eat(),传入 Cat 实例就执行猫的 eat,传入 Dog 实例就执行狗的 eat
- 不依赖类型声明,靠对象实际拥有的方法决定行为,所以更灵活也更动态
- 函数参数接收任意对象,只要它有目标方法,就能正常工作(所谓“鸭子类型”)
- 避免大量 if (obj instanceof X) 判断,让代码更容易扩展新类型
这三者不是割裂的:先有封装好的类(或构造函数),才谈得上被继承;有了继承关系,重写方法才有意义;而多态正是建立在继承+重写之上的运行时表现。它们共同支撑起可维护、易扩展的代码结构。



















