JavaScript类中为什么需要constructor构造函数?无定义也可实例化?
JavaScript类中为什么需要使用constructor构造函数
你测试中观察到「有无显式定义constructor都可以正常创建实例」是符合JavaScript语法规范的:如果类没有显式声明constructor,JS引擎会自动为它注入一个默认的空构造函数,非继承类的默认构造函数等价于constructor() {},所以不需要做初始化操作的类,确实可以省略constructor定义,也能正常实例化。
constructor的核心作用体现在以下场景:
- 接收实例化传入的参数,初始化实例专属属性
你给出的测试代码就能直观看到差异:new Circle(1)传入的参数1没有被处理,实例c上不存在radius属性;而new Circle2(1)的参数被constructor接收后绑定到了实例上,c2.radius的值就是1。如果你的类需要每个实例有独立的属性值,就必须通过constructor完成初始化。 - 执行实例创建阶段的前置逻辑
比如参数合法性校验、实例创建日志上报、初始化内部依赖的其他对象等操作,都可以放在constructor中,会在new关键字调用时自动执行,不需要额外手动调用方法触发。 - 继承场景下调用父类构造逻辑
如果是继承自其他类的派生类,必须在constructor中调用super()方法执行父类的构造逻辑,才能正确获取this指向,否则实例化会直接报错。
你用到的测试代码补充验证效果如下:
// 无显式constructor的类 class Circle { draw() { console.log('hello'); } } const c = new Circle(1); console.log(c.radius) // 输出undefined // 带constructor的类 class Circle2 { constructor(radius) { this.radius = radius; } draw() { console.log('hello'); } } const c2 = new Circle2(1); console.log(c2.radius) // 输出1
内容的提问来源于stack exchange,提问作者Lennard Ong
相关产品推荐
相关产品推荐

