javascript - 使用 TypeScript 扩展 JS Date 但 "this"关键字无法正常工作

标签 javascript typescript

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

Uncaught TypeError: _this.getTime is not a function

当我调试时,我看到“this”是“object Window”类型

这是我正在使用的 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));
};

创建的 .JS 文件是这样的:

var _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());
};
Date.prototype.dst = function () {
    return _this.getTimezoneOffset() < _this.stdTimezoneOffset();
};
Date.prototype.addHours = function (h) {
    _this.setTime(_this.getTime() + (h * 60 * 60 * 1000));
};
Date.prototype.test = function () {
    return +_this.getTime();
};

现在在我看来问题出在 .JS 文件的第一行:

var _this = this;

但我不知道如何解决它。

最佳答案

您正在使用箭头函数。箭头函数在其定义位置的 this 上闭合,而不是通过调用方式来设置其 this;后者对于原型(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());
};

旁注:在增强内置原型(prototype)时,最好使用 definePropertydefineProperties 创建可枚举属性。所以:

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
    }
});

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

关于javascript - 使用 TypeScript 扩展 JS Date 但 "this"关键字无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40222118/

相关文章:

javascript - typescript 中的功能

angular - 隐藏特定路线上的标题 - Angular 6

node.js - 如何在 typescript 中使用 yargs 解析命令行参数

reactjs - 使用 TypeScript,JSS 和 React 为某些 css 属性抛出 `type is unassignable`

javascript - 单独触摸和滚动 mootools 拖动

javascript - 如何在 Typescript 中添加多个断言

javascript - 每两个元素映射一个数组

javascript - 在 JavaScript 中从文本字段获取输入后如何写入文本字段?

javascript - 带有钩子(Hook)的功能组件导致 "cannot read property map of undefined"

typescript - 如何理解类型 any、unknown、{} 之间以及它们与其他类型之间的关系?