位置:首页 > JavaScript > 如何理解JavaScript中ES6 class本质是原型继承语法糖

如何理解JavaScript中ES6 class本质是原型继承语法糖

时间:2026-08-12  |  作者:云端旅人  |  阅读:0

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

Ja vaScript 中怎么理解 ES6 的 class 语法本质上是原型继承的语法糖

ES6 的 class 不是新机制。它只是把原本手动操作原型链的写法,包装成更直观、更结构化的形式。

它背后的行为,依然由 prototype__proto__ 和构造函数的继承关系驱动。

class 的本质是什么

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 继承的底层逻辑

继承仍然走原型链

class Child extends Parent 表面上更简洁,但底层本质没有变。

它依然是在完成这件事:让 Child.prototype.__proto__ === Parent.prototype,同时保证 Child.__proto__ === Parent

这意味着,不仅实例继承链被接好,静态继承链也会一并建立。

至于 super(),实际做的可以理解为调用 Parent.call(this, ...),从而确保父类实例上的初始化逻辑照常执行。

说到底,这整套继承关系并没有跳出 Ja vaScript 原本的 [[Prototype]] 查找机制。

class 的限制从哪里来

不能提升、必须 new,都是“伪装”出来的约束

class 声明不提升,是因为它被转译为函数表达式而非函数声明。

不允许直接调用,必须使用 new,是因为运行时插入了检查逻辑。

这些限制不是语言底层新增的规则,而是语法糖主动施加的“安全层”。

它的目的,是让开发者更自然地遵循面向对象惯例。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多