TypeScript 中的扩展如何工作?

2024-03-16

以下 TypeScript 代码:

class BaseClassWithConstructor {
    private _id: number;
    constructor(id: number) {
        this._id = id;
    }
}

class DerivedClassWithConstructor extends BaseClassWithConstructor {
    private _name: string;
    constructor(id: number, name: string) {
        this._name = name;
        super(id);
    }
}

生成以下 JavaScript 代码:

var __extends = (this && this.__extends) || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};
var BaseClassWithConstructor = (function () {
    function BaseClassWithConstructor(id) {
        this._id = id;
    }
    return BaseClassWithConstructor;
})();
var DerivedClassWithConstructor = (function (_super) {
    __extends(DerivedClassWithConstructor, _super);
    function DerivedClassWithConstructor(id, name) {
        this._name = name;
        _super.call(this, id);
    }
    return DerivedClassWithConstructor;
})(BaseClassWithConstructor);

extends似乎是由__extends功能。

正在尝试找出这个功能背后的魔力。我不明白为什么 我们必须将基类中的属性复制到派生类(即for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];),并使用创建一个新对象__函数并连接之间的原型b, __, d和一个实例__.

这一切背后的原因是什么?


在 ECMAScript 对类的支持成为原生之前,extends 函数会填充预期的继承行为。

如果您习惯了普通的 JavaScript 原型继承,您会想知道为什么它不只是执行__.prototype = b.prototype;部分。如果是这样,您将会有兴趣知道添加for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];意味着静态成员也将被复制。例如...

class BaseClassWithConstructor {
    private _id: number;
    constructor(id: number) {
        this._id = id;
    }

    static doIt() {
        alert('Done it');
    }
}

class DerivedClassWithConstructor extends BaseClassWithConstructor {
    private _name: string;
    constructor(id: number, name: string) {
        this._name = name;
        super(id);
    }
}

DerivedClassWithConstructor.doIt();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TypeScript 中的扩展如何工作? 的相关文章

随机推荐

  • Javascript/jquery,获取 (x,y) 处的所有 div 位置。转发触碰? [复制]

    这个问题在这里已经有答案了 可能的重复 如何获取位于单击点的所有元素的列表 https stackoverflow com questions 3735278 how to get a list of all elements that r
  • 无法启动 RMI Fibonacci 服务器

    我正在学习 Java RMI 并且创建了一个非常简单的服务器来计算斐波那契数 服务器 FibonacciServer 创建一个负责计算序列 Fibonacci 的对象 并且该对象实现一个接口 IFibonacci FibonacciServ
  • UPDATE 后的 @@ROWCOUNT 是否可靠地衡量*匹配*行?

    Does ROWCOUNT可靠地告诉你有多少行matched the WHERE条款中的UPDATE 而不是实际有多少changed by it In 的文档 ROWCOUNT http msdn microsoft com en gb l
  • 设置我所有表单的可本地化属性

    有没有办法自动设置此属性 我们有数百种表单需要本地化 将所有这些表单设置为 true 将是一场噩梦 有没有办法让 Visual Studio 将解决方案 项目中的所有表单设置为 Localized true 当您创建一个新的Windows窗
  • 使用rails中的link_to在锚标记上指定附加属性

    假设我想要在 Rails 中输出这样的 html a href Action a 如何使用 Rails 中的 link to 帮助程序指定属性 角色和 tabIndex 查看link to 的 Rails 文档 http api rubyo
  • Android Studio 2.0 - 应用程序首次运行时暂停/白屏

    自从升级到 Android Studio 2 0 稳定版 以来 我注意到一个问题 而我安装的以前版本的 Android Studio 1 5 中不存在这个问题 我正在开发一个当前项目 我将在真实设备和模拟器上构建 调试版本 并运行该项目 我
  • 自定义Android通知声音

    我正在尝试在我的应用程序中实现自定义通知声音 我编写了以下代码 但应用程序仅播放默认声音 而不播放我在原始文件夹中添加的自定义声音 收到通知后 日志甚至不会抛出任何错误或异常来说明为什么不播放自定义声音 我尝试在网上搜索并尝试采用不同的方法
  • 如何在执行connectedAndroidTest时不运行特定测试?

    执行我们的一些仪器测试需要很长时间 因此 当我运行所有其他仪器测试时 我不想运行它们gradle connectedAndroidTest 为什么我不注释这些测试 Ignore http junit sourceforge net java
  • 像 Tinder 一样滑动浏览照片堆栈 - 跨平台(混合/HTML5 都可以)

    我希望创建一个像 Tinder 这样的应用程序 用户可以在其中滑动照片堆栈 有谁知道跨平台重现这种效果的方法吗 到目前为止 我正在考虑使用 jQuery Mobile 构建一个 Web 应用程序 TouchSwipe 用于滑动检测 看 ht
  • UTF-16 perl 输入输出

    我正在编写一个脚本 它将 UTF 16 编码的文本文件作为输入并输出 UTF 16 编码的文本文件 use open encoding UTF 16 open INPUT lt input txt or die cannot open gt
  • 用 JavaScript 替换非数字字符?

    我使用正则表达式 90 2 5 1 0 9 9 用于电话验证 但是当有人输入任何特殊字符 例如 在输入中 我想用空字符串替换字符 删除它们 请注意 我不想替换 我怎样才能做到这一点 这将删除给定字符串中的所有非数字字符 myString m
  • 如何从 SQL Server 数据库中删除所有外键?

    我想删除具有以下条件的所有外键 SELECT CONSTRAINT NAME FROM INFORMATION SCHEMA TABLE CONSTRAINTS WHERE TABLE NAME IN Table1 Table2 AND C
  • 如何在 CollapsingToolbarLayout 内滚动 Recyclerview

    我在 CollapsingToolbarLayout 中有 recyclerview 我希望它可以滚动 但事实并非如此 当我滚动时 appbar 正在滚动 但 recyclerview 却没有滚动 我尝试了不同的方法 但它不起作用 这是我的
  • C#:指定 Dll 引用的位置

    在C 控制台应用程序中 我们可以通过 解决方案资源管理器 引用 然后添加reqd dll的引用 来添加dll引用 在这种情况下 应用程序期望 dll 存在于同一文件夹中 如果没有 那么应用程序将无法工作 抛出异常 是否有可能 如果 dll
  • 对 -finstrument-functions 的未定义引用

    我正在尝试跟踪内核函数并且我正在使用 finstrument functions这样做 但我收到未定义的参考错误 如下所示 arch arm kernel elf c 9 undefined reference to cyg profile
  • 使用 PHP 打乱多个字符串值

    大家好 我每个问题有 4 个选项 每个字符串都带有冗长的句子 我的变量将类似于 option1 option2 option3 option4 我想像 3 2 1 4 一样随机排列这个变量顺序 或者类似地它会像随机一样随机排列函数 我以多种
  • 是否可以使用 npm / package.json 内的环境变量?

    我正在尝试构建一个 package json 以便在 Heroku 上运行 NodeJS 应用程序时 它将使用环境变量运行 script postinstall 步骤 例如 scripts postinstall command ENV V
  • Visual Studio 2017 无法打开源文件

    我是 C 新手 刚刚安装了 Visual Studio Community 2017 我不太知道要使用什么工作流程 所以我凭自己的直觉 当我尝试包括windows h using include
  • FontAwesome Icons 仅在鼠标悬停时旋转?

    在很棒的字体中 我如何使用此代码 i class fa fa spinner fa spin i 仅适用于鼠标悬停 您也可以创建另一个仅用于悬停的类 而不是覆盖该类 fa spin hover hover webkit animation
  • TypeScript 中的扩展如何工作?

    以下 TypeScript 代码 class BaseClassWithConstructor private id number constructor id number this id id class DerivedClassWit