es6 class本质是原型链的语法糖,转为es5后由构造函数、prototype属性、__proto__链路及静态属性归属共同构成;构造函数含_classcallcheck校验,实例__proto__指向prototype,继承时存在双层原型链,static成员直接挂载构造函数。

ES6 的 class 本质是原型链的语法糖,转成 ES5 后,核心结构就是「构造函数 + 原型对象 + 显式原型链绑定」。分析底层原型结构,关键不是看 class 写法,而是看转换后生成的函数、prototype 属性、__proto__ 链路和静态属性归属。
看构造函数是否带 _classCallCheck 检查
Babel 转换后的构造函数开头通常包裹一层类型校验:
- 调用时若没用
new,会抛出"Cannot call a class as a function" - 这说明该函数被设计为“仅构造器”,不是普通函数——这是 class 语义的强制约束
- 验证方式:打印
Person.prototype.constructor === Person应为true;而new Person().__proto__ === Person.prototype也应成立
查实例的 __proto__ 和原型方法存放位置
所有实例方法(非 static)都会被挂载到构造函数的 prototype 对象上:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 比如
class Animal { speak() {} }→ 转成 ES5 后,Animal.prototype.speak是一个函数 - 执行
const a = new Animal(),则a.__proto__ === Animal.prototype - 可进一步验证:
Animal.prototype.hasOwnProperty('speak')返回true,但a.hasOwnProperty('speak')是false
追踪 extends 继承下的双层原型链
子类继承父类时,Babel 会生成两处关键连接:
-
Dog.prototype.__proto__ === Animal.prototype:让实例方法可沿链查找(如dog.speak()) -
Dog.__proto__ === Animal:让静态方法可继承(如Dog.run()若父类有static run()) - 子类构造函数内部必含
Animal.call(this, ...)或等效逻辑,确保实例属性正确初始化
识别静态成员与实例成员的归属差异
static 关键字定义的成员不会出现在原型链上,而是直接挂在构造函数本身:
-
class A { static foo() {} }→ 转换后A.foo是函数,但A.prototype.foo是undefined -
A.__proto__指向Function.prototype,而A.foo不通过原型链查找,是自有属性 - 可通过
Object.getOwnPropertyNames(A)查看所有静态属性,对比Object.getOwnPropertyNames(A.prototype)区分二者
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










