Javascript 使用TypeScript扩展JS日期,但;这";关键字工作不正常

Javascript 使用TypeScript扩展JS日期,但;这";关键字工作不正常,javascript,typescript,Javascript,Typescript,使用下面的代码扩展JavaScript日期类型时,调用新函数时会抛出错误,因为this关键字引用不正确,即调用addHours函数时,得到的错误是: 未捕获的TypeError:\u this.getTime不是函数 调试时,我看到“this”是“objectwindow”类型 这是我正在使用的TypeScript代码: declare interface Date { stdTimezoneOffset: () => number; dst: () => boole

使用下面的代码扩展JavaScript日期类型时,调用新函数时会抛出错误,因为
this
关键字引用不正确,即调用
addHours
函数时,得到的错误是:

未捕获的TypeError:\u this.getTime不是函数

调试时,我看到“this”是“objectwindow”类型

这是我正在使用的TypeScript代码:

declare interface Date {
    stdTimezoneOffset: () => number;
    dst: () => boolean;
    addHours: (h: number) => void;
    test: () => void;
}

Date.prototype.stdTimezoneOffset = () => {
    var jan = new Date(this.getFullYear(), 0, 1);
    var jul = new Date(this.getFullYear(), 6, 1);
    return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
};

Date.prototype.dst = () => {
    return this.getTimezoneOffset() < this.stdTimezoneOffset();
};

Date.prototype.addHours = (h: number) => {
    this.setTime(this.getTime() + (h * 60 * 60 * 1000));
};

但我不知道如何修复它。

您正在使用箭头函数。箭头函数关闭在定义它们的
this
位置,而不是通过调用它们的方式设置它们的
this
;后者对于原型功能非常重要

改用普通函数:

Date.prototype.stdTimezoneOffset = function() {
    var jan = new Date(this.getFullYear(), 0, 1);
    var jul = new Date(this.getFullYear(), 6, 1);
    return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
};

旁注:在增强内置原型时,最好使用
defineProperty
defineProperties
创建不可枚举属性。因此:

Object.defineProperties(Date.prototype, {
    stdTimezoneOffset: {
        value: function () {
            var jan = new Date(this.getFullYear(), 0, 1);
            var jul = new Date(this.getFullYear(), 6, 1);
            return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
        },
        configurable: true,
        writable: true
    },
    dst: {
        value: function() {
            return this.getTimezoneOffset() < this.stdTimezoneOffset();
        },
        configurable: true,
        writable: true
    },
    addHours: {
        value: function(h: number) {
            this.setTime(this.getTime() + (h * 60 * 60 * 1000));
        },
        configurable: true,
        writable: true
    }
});
Object.defineProperties(Date.prototype{
stdTimezoneOffset:{
值:函数(){
var jan=新日期(this.getFullYear(),0,1);
var jul=新日期(this.getFullYear(),6,1);
返回Math.max(jan.getTimezoneOffset(),jul.getTimezoneOffset());
},
对,,
可写:对
},
dst:{
值:函数(){
返回此.getTimezoneOffset()

(可配置:true,可写:true
只是因为这是
Date.prototype
上内置属性的默认值,所以我与它们保持一致。)

这里也有一个问题的答案:可能是
Date.prototype.stdTimezoneOffset = function() {
    var jan = new Date(this.getFullYear(), 0, 1);
    var jul = new Date(this.getFullYear(), 6, 1);
    return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
};
Object.defineProperties(Date.prototype, {
    stdTimezoneOffset: {
        value: function () {
            var jan = new Date(this.getFullYear(), 0, 1);
            var jul = new Date(this.getFullYear(), 6, 1);
            return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
        },
        configurable: true,
        writable: true
    },
    dst: {
        value: function() {
            return this.getTimezoneOffset() < this.stdTimezoneOffset();
        },
        configurable: true,
        writable: true
    },
    addHours: {
        value: function(h: number) {
            this.setTime(this.getTime() + (h * 60 * 60 * 1000));
        },
        configurable: true,
        writable: true
    }
});