JavaScript面向对象三大特征是可落地的实践:封装通过闭包、#私有字段或下划线约定实现;继承依托prototype链或extends语法;多态通过方法重写与动态绑定体现。

JavaScript 面向对象编程的三大核心特征——封装、继承、多态——不是抽象概念,而是可直接写进代码的具体实践。它们在 JS 中的落地方式和传统强类型语言(如 Java)略有不同,主要依托函数、原型(prototype)、class 语法以及动态特性来实现。
封装:用私有数据 + 公共接口控制访问
JS 原生不支持 private 关键字(ES2022 起才支持 #field 私有字段),但可通过多种方式达成封装目的:
- 使用闭包隐藏内部变量,只暴露可控方法(适合构造函数模式)
- 用
#前缀定义真正私有字段(推荐现代写法,TS 或较新 JS 环境支持) - 约定俗成:用下划线
_name表示“请勿直接访问”,配合 getter/setter 提供校验逻辑
例如:
class Person {#name;
#age;
constructor(name, age) {
this.#name = name;
this.#age = Math.max(0, Math.min(150, age)); // 封装校验逻辑
}
getName() { return this.#name; }
setAge(age) {
if (age >= 0 && age }
}
继承:通过 prototype 链或 extends 实现行为复用
JS 的继承本质是原型链查找。ES6 的 class 和 extends 是语法糖,底层仍依赖 __proto__ 和 prototype:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
- 子类 constructor 中必须调用
super()初始化父类实例属性 - 子类可重写父类方法,也可用
super.method()调用父类版本 - 所有方法默认定义在父类/子类的
prototype上,节省内存
例如:
class Animal {constructor(name) { this.name = name; }
eat(food) { console.log(`${this.name} 吃了 ${food}`); }
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
eat(food) {
super.eat(food + '(狗粮版)'); // 复用并增强
}
}
多态:同一方法调用,因对象类型不同而执行不同逻辑
JS 天然支持运行时多态——没有编译期类型检查,方法调用完全取决于运行时对象的实际结构:
- 只要对象有同名方法,就能被统一调用(“鸭子类型”)
- 常用于策略模式、事件处理器、渲染函数等场景
- 无需接口声明或类型转换,靠函数参数或上下文动态决定行为
例如:
function feed(animal, food) {animal.eat(food); // 不管 animal 是 Dog、Cat 还是 Bird,只要它有 eat 方法就可执行
}
const dog = new Dog('旺财', '金毛');
const cat = { name: '咪咪', eat(food) { console.log(`${this.name} 轻轻舔了舔 ${food}`); } };
feed(dog, '骨头');
feed(cat, '小鱼干');


















