RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 697636
Accepted
Мистер Фикс
Мистер Фикс
Asked:2020-07-25 23:24:27 +0000 UTC2020-07-25 23:24:27 +0000 UTC 2020-07-25 23:24:27 +0000 UTC

如何继承Date?(打字稿)

  • 772

这是一个看似合乎逻辑的选择:

class MyDate extends Date {
    constructor(dateTimeStr: string) {
        super(dateTimeStr);
        console.log(this, typeof(this));
        this.setTime(this.getTime() + 1000);
    }        
}

但事实证明,显然,因为它作为函数super调用,而不是作为类调用,所以它返回一个字符串。因此,它变成了一个字符串。DateDate()new DateDatethis

告诉我您通常如何延长日期。

javascript
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Grundy
    2020-07-26T17:48:11Z2020-07-26T17:48:11Z

    如果使用 ES6 语法,则提供的代码示例有效。在这种情况下与打字稿的区别仅在于没有传递给构造函数的参数类型。

    这是可能的,因为规范部分中的类Date具有以下几行:

    Date 构造函数被设计为可子类化。它可以用作类定义的扩展子句的值。打算继承指定 Date 行为的子类构造函数必须包括对 Date 构造函数的超级调用,以使用 [[DateValue]] 内部槽创建和初始化子类实例。

    定义了构造函数Date,以便可以创建子类。它可以用作extends类定义中的值。必须继承该行为的子类构造函数Date必须包含super创建和初始化内部槽 [[DateValue]]的调用。

    为确保一切正常,您可以使用示例:

    class MyDate extends Date {
      constructor(dateTimeStr) {
        super(dateTimeStr);
        console.log(this, typeof(this));
        this.setTime(this.getTime() + 1000);
      }
    }
    
    var d = new MyDate("2017-07-26T00:00:00.000Z");
    
    console.log(d.getDate()); // 26


    为什么它不能在打字稿中工作,而需要手动实施?

    问题出在 internal slot[[DateValue]]上,所有函数都在内部访问它Date。

    因此,下面的例子会抛出一个异常:

    function MyDate(dateTimeStr) {
      Date.call(this, dateTimeStr);
      this.setTime(this.getTime() + 1000);
    }
    
    MyDate.prototype = Object.create(Date.prototype);
    
    var d = new MyDate("2017-07-26T00:00:00.000Z");

    进入打字稿的实现有点复杂

    function MyDate(dateTimeStr) {
        var _this = _super.call(this, dateTimeStr) || this;
        console.log(_this, typeof (_this));
        _this.setTime(_this.getTime() + 1000);
        return _this;
    }
    

    在这种情况下,它会覆盖this将从构造函数返回的 ,并且_super.call(this, dateTimeStr)在这种情况下调用等同于调用Date.call(this, dateTimeStr),它只会返回一个字符串。

    如何决定?

    如果您在其中指定 ES6 和更高版本,编译密钥-target可以帮助解决这个问题。

    在手动实施的情况下,类似的问题建议创建一个 Date 并更改其原型,如下所示:

    function MyDate(dateTimeStr) {
      var _this = new Date(dateTimeStr);
      _this.setTime(_this.getTime() + 1000);
      Object.setPrototypeOf(_this, MyDate.prototype);
      return _this;
    }
    
    MyDate.prototype = Object.create(Date.prototype);
    MyDate.prototype.foo = function(){
      return `${this.getFullYear()}-${this.getMonth()+1}`;
    }
    
    var d = new MyDate("2017-07-26T00:00:00.000Z");
    console.log(d.getDate()); // 26
    console.log(d instanceof Date); // true
    console.log(d instanceof MyDate); // true
    console.log(d.foo()); //2017-7 

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5