javascript - 中间ctor对象在__extends中做什么

标签 javascript coffeescript typescript

TypeScript 和 CoffeeScript 都使用 __extends 函数来设置继承。这是 TypeScript 的一种形式(CoffeeScript 非常相似)。

var __extends = 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 __();
};

为什么他们需要function __()(CoffeeScript中的function ctor())?为什么不直接设置原型(prototype):

var __extends = this.__extends || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];

    d.prototype = new b();
};

最佳答案

这三行a):

    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();

几乎完全等同于b):

    d.prototype.__proto__ = b.prototype;

之所以优先选择a)是因为__proto__是非标准的。

我说几乎完全,因为在a.) 构造函数是可枚举的,而在b.) 中它没有被修改,因此保持原样(不可枚举)。更好的实现是使用 Object.create,但这在 ES3 中不可用(它仍然是 TypeScript 的编译目标)。

关于javascript - 中间ctor对象在__extends中做什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24254089/

相关文章:

javascript - 使用react-router-dom重定向react中的onclick事件

javascript - 如何仅对图像的一部分使用透明效果

javascript - 这两个实现有什么不同

typescript - 如何在 TypeScript 接口(interface)中要求特定字符串

javascript - 错误错误 : Angular JIT compilation failed: '@angular/compiler' not loaded

javascript - 找不到没有 ID 的 FoodObject

javascript - 在 MVC Razor foreach 循环中编写 JavaScript 代码

coffeescript - 将 Typescript 添加到 Coffeescript

javascript - typeahead.bundle.js 如何通过在下拉建议上按 ENTER 开始搜索?

typescript - 如何在 Jest 的 globalSetup 函数中使用模块导入 (@) 和 TypeScript?