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