es6 class是构造函数和原型链的语法糖,本质仍是函数;其声明不可提升、需用new调用,实例方法挂载在prototype上,静态方法挂载在类本身,继承通过原型链实现。

ES6 的 class 不是新机制,它只是把原本要手动操作原型链的写法,包装成更直观、更结构化的形式——背后所有行为,依然靠 prototype、__proto__ 和构造函数的继承关系驱动。
class 声明实际就是函数
用 typeof 检查一个 class,结果是 "function"。Babel 转译后,class Person { ... } 会变成一个带防护逻辑的构造函数,比如:
- 自动插入
_classCallCheck(this, Person),防止不加new直接调用; - 实例属性写在构造函数体内(
this.name = name); - 实例方法被收集后,通过
Object.defineProperty挂到Person.prototype上; - 静态方法则直接挂到
Person函数本身上。
方法和属性的归属位置没变
你写的 sayHi() {} 并不会变成实例自身的属性,而是被定义在 Person.prototype 上;static create() 则挂在 Person 函数对象上。这和 ES5 中手动写 Person.prototype.sayHi = function(){...} 效果完全一致,只是省去了手写 prototype 的步骤。
继承仍然走原型链
class Child extends Parent 看似简洁,底层仍是设置 Child.prototype.__proto__ === Parent.prototype,并确保 Child.__proto__ === Parent(静态继承)。super() 实际调用的是 Parent.call(this, ...),保证父类实例初始化逻辑被执行。整个链条没有脱离 JavaScript 原有的 [[Prototype]] 查找机制。
不能提升、必须 new,都是“伪装”出来的约束
class 声明不提升,是因为它被转译为函数表达式而非函数声明;不允许直接调用(必须 new),是因为运行时插入了检查逻辑。这些限制不是语言底层新增的规则,而是语法糖主动施加的“安全层”,目的是让开发者更自然地遵循面向对象惯例。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











