2016-10-24 2 views
1

JavaScriptのDate型を拡張するために以下のコードを使用すると、thisキーワードが正しく参照されていないため、私は「これは」タイプの「オブジェクトウィンドウ」であることがわかりデバッグするときにこれは私が使用してい活字体コードですTypeScriptを使用してJS Dateを拡張しましたが、「this」キーワードが正しく機能していません

Uncaught TypeError: _this.getTime is not a function

を::

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)); 
}; 
私が手にエラーがある addHours関数を呼び出します

と作成された.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; 

しかし、私はしないでくださいそれを修正する方法を知っている。

+0

問題への答えがここにありますhttp://stackoverflow.com/a/32330345/545230 – kazandzhiro

+1

[TypeScriptのネイティブJavaScript番号オブジェクトを拡張する]の可能な複製(http://stackoverflow.com/questions/32330098/extend-native-javascript-number- object-in-typescript) –

答えて

2

あなたは矢印機能を使用しています。矢印の機能は、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を使用して -enumerableプロパティを作成することは非常に良い考えです。だから、:

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

(。それは、内蔵のDate.prototypeのプロパティのデフォルト値ですので、私は彼らと一致しているんだという理由だけでconfigurable: true, writable: trueがある)

+0

ありがとう...これは私の問題を解決しました... – StuartMc

関連する問題