JavaScript类方法中单独使用super关键字为何会报错
问题结论
这个现象是JavaScript的明确语法设计规则,不属于语法怪癖。
规则说明
ECMAScript语言规范从没有将super定义为可以独立使用、返回对象引用的普通表达式,它是专门为类继承场景设计的特殊语法标记,仅支持两类合法语法形式:
- 构造函数内的函数调用形式:
super(/* 可选参数 */),作用是调用父类构造函数完成实例初始化,该形式必须紧跟调用括号 - 属性/方法访问形式:
super.属性名或者super[表达式],作用是访问当前方法所绑定HomeObject的原型上的成员,该形式必须紧跟属性访问标记
单独书写super时,不存在对应的语义定义——规范从未规定独立出现的super应该返回什么值,JS解析器会在语法分析阶段直接判定为非法,抛出invalid use of keyword 'super'的语法错误,代码根本不会进入执行阶段。
示例中使用的super.constructor完全符合第二类合法语法规则:bar方法的HomeObject是Foo.prototype,其原型为Object.prototype,Object.prototype.constructor默认指向Object构造函数,因此代码可以正常执行,输出结果完全符合规范预期。
验证代码
class Foo { constructor() { this.bar(); } bar() { /* console.log(super); 会抛出如下SyntaxError: Uncaught SyntaxError: invalid use of keyword 'super' 并不会打印HomeObject(即Foo.prototype)的原型(本例中为Object.prototype) */ console.log(super.constructor); // 此处运行无异常,会打印Object构造函数 } } new Foo
内容的提问来源于stack exchange,提问作者Slev7n
相关产品推荐
相关产品推荐

