2016-09-09 58 views
1

我想创建一个新的Date派生类和重写构造:覆盖在日期子类的构造

export class MyDate extends Date { 
    constructor(str: string) { 
    super(str); 
    } 
} 

现在,如果我创建一个MyDate对象,这是行不通的:

var myDate = new MyDate("2016-10-20T12:30:00+0200"); 
console.log(myDate.toDateString()); // it crashes, myDate is incorrect 

我得到TypeError: Method Date.prototype.toDateString called on incompatible receiver [object Object]

如何覆盖Date构造函数?可能吗?

+0

您在'MyDate'声明中缺少右括号。那是你的原始代码吗?您还需要确切地说明当您尝试登录时会发生什么。 “它崩溃”是什么意思? –

+0

你是对的,这个类是:
'类指明MyDate扩展日期{'
'构造函数(STR:字符串){' '超(STR);' '}' '}' 和错误是: 'TypeError:方法Date.prototype.toDateString在不兼容的receiver [object Object]上调用' – Factorial

回答

1

根据this question and the accepted answer,发生这种情况是因为在ES5中不允许继承Date。下面ES6代码工作在Chrome,因为Chrome浏览器原生支持ES6类(这是完全一样的代码,但我删除类型注释):

class MyDate extends Date { 
 
    constructor(str) { 
 
    super(str); 
 
    } 
 
} 
 

 
var myDate = new MyDate("2016-10-20T12:30:00+0200"); 
 
console.log(myDate.toDateString());

如果你只需要这个工作在本机支持ES6类的环境,请将TypeScript的--target编译器选项更改为'es6'。否则,你将需要做别的事情。

一种解决方法可能是将MyDate定义为使其具有Date作为成员变量。例如:

class MyDate { 

    private date:Date; 

    constructor(str: string) { 
    this.date = new Date(str); 
    } 

    toDateString(): string { 
    return this.date.toDateString(); 
    } 
}