0

0

TypeScript 中 super 关键字的正确用法与常见误区

碧海醫心

碧海醫心

发布时间:2026-02-12 23:17:30

|

277人浏览过

|

来源于php中文网

原创

TypeScript 中 super 关键字的正确用法与常见误区

本文详解 typescript 中 `super` 的语义:它仅用于访问父类原型上的属性/方法或调用父类构造函数,**不能用于读取父类实例字段(如 `super.firstname`)**,否则返回 `undefined`;实例属性必须通过 `this` 访问。

在 TypeScript(以及底层 JavaScript)中,super 是一个严格语义化的关键字,其行为与 C# 或 Java 中的 base/super 存在本质差异——这正是许多开发者初遇困惑的根源。核心在于:super 只能访问定义在父类原型([[Prototype]])上的成员,而无法访问挂载在实例对象(this)上的属性。

为什么 super.firstName 返回 undefined?

回顾你的代码:

class Person {
    public firstName: string;
    public lastName: string;

    constructor(fn: string, ln: string) {
        this.firstName = fn; // ✅ 属性被赋值到 this(实例)上
        this.lastName = ln;
    }
}

class Customer extends Person {
    constructor(fn: string, ln: string) {
        super(fn, ln); // ✅ 正确:调用父类构造函数
    }

    displayDetails() {
        console.log(`First Name: ${super.firstName}\tLast Name: ${super.lastName}`); // ❌ 错误!
    }
}

虽然 firstName 和 lastName 在 Person 类中声明为 public,但它们是实例字段(instance fields),在构造函数中通过 this.firstName = ... 显式挂载到新创建的实例对象上,而非定义在 Person.prototype 上。

而 super.xxx 的查找逻辑等价于:

Object.getPrototypeOf(this).xxx  // 即 Person.prototype.xxx

由于 Person.prototype 上并不存在 firstName 属性(它只存在于 this 实例上),因此 super.firstName 查找失败,返回 undefined。

Veed AI Voice Generator
Veed AI Voice Generator

Veed推出的AI语音生成器

下载

✅ 正确写法始终使用 this 访问继承来的实例属性:

displayDetails() {
    console.log(`First Name: ${this.firstName}\tLast Name: ${this.lastName}`); // ✅ 正确
}

super 的合法使用场景

场景 示例 说明
调用父类构造函数 super(arg1, arg2) 必须是子类构造函数中的第一条语句
调用父类方法 super.sayHello() 要求 sayHello 定义在父类原型上(如 Person.prototype.sayHello)
访问父类 getter/setter super.fullName 若 fullName 是父类定义的 get 访问器,则可通过 super 访问

例如,补充一个合法使用 super 的示例:

class Person {
    constructor(public firstName: string, public lastName: string) {}

    get fullName(): string {
        return `${this.firstName} ${this.lastName}`;
    }

    introduce() {
        return `Hi, I'm ${this.fullName}`;
    }
}

class Customer extends Person {
    introduce() {
        // ✅ super 调用父类方法(定义在原型上)
        return `Customer: ${super.introduce()}`;
    }

    get displayName() {
        // ✅ super 访问父类 getter
        return `★ ${super.fullName} ★`;
    }
}

注意事项与最佳实践

  • ⚠️ 永远不要用 super 读取或写入实例字段(如 super.name, super.age),一律使用 this;
  • ⚠️ super() 必须在子类构造函数中 this 被访问前调用,否则会报运行时错误;
  • ? 可通过 console.log(Object.getPrototypeOf(new Customer('a','b'))) 验证哪些成员实际存在于原型链上;
  • ? 若需强制“只读访问父类实现”,可将逻辑封装为 protected 方法或 getter,再通过 super.method() 调用。

总结

TypeScript 的 super 不是“父类实例的引用”,而是“父类原型的代理”。理解这一设计哲学(源自 ES6 class 的语义),就能避免绝大多数继承相关陷阱。记住口诀:

实例属性 → 用 this;原型方法/访问器 → 才用 super。

修正后的完整可运行代码如下:

class Person {
    constructor(public firstName: string, public lastName: string) {}
}

class Customer extends Person {
    constructor(fn: string, ln: string) {
        super(fn, ln);
    }

    displayDetails() {
        console.log(`First Name: ${this.firstName}\tLast Name: ${this.lastName}`);
    }
}

const c = new Customer("Pradeep", "Kumar");
c.displayDetails(); // 输出:First Name: Pradeep   Last Name: Kumar

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
es6新特性
es6新特性

es6新特性有:1、块级作用域变量;2、箭头函数;3、模板字符串;4、解构赋值;5、默认参数;6、 扩展运算符;7、 类和继承;8、Promise。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

106

2023.07.17

es6新特性有哪些
es6新特性有哪些

es6的新特性有:1、块级作用域;2、箭头函数;3、解构赋值;4、默认参数;5、扩展运算符;6、模板字符串;7、类和模块;8、迭代器和生成器;9、Promise对象;10、模块化导入和导出等等。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

196

2023.08.04

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2025.12.24

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

579

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

20

2025.12.06

console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

419

2023.08.08

console.log是什么
console.log是什么

console.log 是 javascript 函数,用于在浏览器控制台中输出信息,便于调试和故障排除。想了解更多console.log的相关内容,可以阅读本专题下面的文章。

519

2024.05.29

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

5585

2023.07.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

4

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
TypeScript 教程
TypeScript 教程

共19课时 | 2.9万人学习

TypeScript——十天技能课堂
TypeScript——十天技能课堂

共21课时 | 1.1万人学习

TypeScript-45分钟入门
TypeScript-45分钟入门

共6课时 | 0.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号