es6 的 class 是对原型继承的语法糖,本质仍是函数,方法挂载于 prototype 且不可枚举、不可重写;实例方法在原型上,静态方法在类自身,私有字段引擎隔离;继承通过 extends 和 super 实现,底层依赖原型链。

ES6 的 class 不是新机制,而是对 JavaScript 原型继承的语法封装——它让面向对象写法更清晰,但运行时一切仍靠 prototype 和 [[Prototype]] 链 驱动。
class 本质仍是函数,只是写法更规范
用 class Person{} 声明的类,底层就是一个普通函数:
- 执行
typeof Person返回"function" -
Person.prototype是所有实例共享方法的存放位置 - 构造函数体(
constructor)对应函数自身的执行逻辑 - 类声明存在“暂时性死区”,不能像函数声明那样被提升
实例方法、静态方法、私有属性各走各的路
类中定义的内容按归属分三类,挂载位置完全不同:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
实例方法(如
sayHello())自动添加到Person.prototype,供所有实例通过原型链访问 -
静态方法(用
static声明)直接挂在Person函数对象自身上,new Person()创建的实例无法调用 -
私有字段(以
#开头,如#age)仅在类内部可访问,不暴露在原型或实例属性中,由引擎强制隔离
继承靠 extends + super,但底层还是原型链
class Child extends Parent 看似简洁,背后仍依赖原型机制:
-
Child.prototype.__proto__指向Parent.prototype,形成方法查找链 -
super()在子类constructor中必须先调用,本质是执行Parent.call(this, ...)初始化实例属性 -
super.methodName()实际是从Parent.prototype上取方法并绑定当前this - 子类静态方法可通过
super访问父类静态方法,因为Child.__proto__ === Parent
不可枚举、不可重写、不可代理——class 方法的默认特性
与手动挂载到 prototype 的方法不同,class 内定义的方法自带严格行为:
- 所有方法默认 不可枚举(
Object.keys(Person.prototype)拿不到它们) - 方法属性描述符中
writable、enumerable、configurable均为false,无法被简单赋值覆盖 - 不能用
Proxy直接拦截类方法调用(需代理实例或原型对象本身) - 这保证了 class 接口的稳定性,也区别于普通对象字面量上的函数属性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










