JavaScript的OOP三大特性确实存在,但基于原型机制:封装通过闭包、私有字段(#)或命名约定实现;继承依赖原型链,class extends是语法糖;多态体现为鸭子类型和方法重写,无编译期类型检查。

JavaScript 中的面向对象编程(OOP)三大特性——封装、继承、多态——确实存在,但实现方式与传统静态语言(如 Java、C++)不同。它基于原型(prototype)机制而非类(class)的“模板式”定义,ES6 的 class 语法只是语法糖,底层仍是原型链。下面分别说明这三大特性在 JS 中的真实体现:
封装:通过作用域和属性控制实现数据隐藏
JS 没有原生的 private 关键字(ES2022 起支持私有字段 #name),但可通过多种方式实现封装逻辑:
- 利用函数作用域 + 闭包:构造函数内用
let/const声明变量,仅暴露有限方法访问 - 使用 ES2022 私有字段(
#前缀):真正限制外部读写,只能在类内部访问 - 约定命名(如
_name):虽可访问,但表明“不应直接使用”,靠团队规范维护
示例(私有字段):
<script><br> class Person {<br> #age = 0;<br> constructor(name) { this.name = name; }<br> getAge() { return this.#age; }<br> setAge(val) { if (val > 0) this.#age = val; }<br> }<br> const p = new Person('Alice');<br> console.log(p.#age); // SyntaxError:非法访问私有字段<br> </script>继承:基于原型链,class extends 是语法糖
JS 的继承本质是对象间原型的链接。每个函数(包括 class 构造器)都有 prototype 属性,实例通过 __proto__(或 Object.getPrototypeOf())指向其构造器的 prototype。
-
class Child extends Parent会自动设置Child.prototype.__proto__ === Parent.prototype - 子类可调用
super()初始化父类实例属性,也可用super.method()调用父类方法 - 手动继承可用
Object.setPrototypeOf(childProto, parentProto)或Object.create(parentProto)
关键点:JS 是**单继承、原型继承**,不支持多继承;但可通过混入(mixin)模拟部分多继承行为。
多态:运行时动态绑定,依赖鸭子类型与方法重写
JS 没有编译期类型检查,所谓“多态”体现为:同一操作(如调用 .speak())作用于不同对象时,执行各自定义的方法,无需统一接口声明。
- 只要对象有同名方法,就能被统一调用(鸭子类型:“如果它走起来像鸭子,叫起来像鸭子,那它就是鸭子”)
- 子类重写父类方法即构成“重写多态”,
super可保留父类逻辑 - 没有方法重载(overload)——函数签名不区分参数数量或类型,后定义同名方法会覆盖前者
示例:
const animals = [new Dog(), new Cat()];animals.forEach(animal => animal.speak()); // 各自输出不同内容,无需 Animal 接口声明
不复杂但容易忽略:JS 的 OOP 特性不是靠强制约束,而是靠原型机制、作用域规则和运行时动态性自然达成。理解 this 绑定、原型链查找、以及 new 的执行过程,比死记“三大特性”更能掌握 JS 面向对象的本质。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











