Javascript Dateオブジェクトを拡張するにはどうすればいいですか? 質問する

Javascript Dateオブジェクトを拡張するにはどうすればいいですか? 質問する

ネイティブ オブジェクト自体を変更せずに、ネイティブ Date オブジェクトをサブクラス化/拡張しようとしています。

私はこれを試しました:

    var util = require('util');

    function MyDate() {
        Date.call(this);
    }
    util.inherits(MyDate, Date);

    MyDate.prototype.doSomething = function() {
        console.log('Doing something...');
    };        

    var date = new MyDate();
    date.doSomething();

    console.log(date);
    console.log(date.getHours());

この:

function MyDate() {

    }

    MyDate.prototype = new Date();

    MyDate.prototype.doSomething = function() {
        console.log("DO");
    }

    var date = new MyDate();
    date.doSomething();
    console.log(date);

どちらの場合も は機能しますが、や などdate.doSomething()のネイティブ メソッドのいずれかを呼び出すと、「TypeError: this is not a Date object.」というエラーが発生します。date.getHours()console.log(date)

何かアイデアはありますか? それとも、トップレベルの Date オブジェクトを拡張するしかないのでしょうか?

ベストアンサー1

date.js の v8 コードを見てみましょう。

function DateGetHours() {
  var t = DATE_VALUE(this);
  if (NUMBER_IS_NAN(t)) return t;
  return HOUR_FROM_TIME(LocalTimeNoCheck(t));
}

DATE_VALUE は次のようなことを実行するマクロのようです:

DATE_VALUE(arg) = (%_ClassOf(arg) === 'Date' ? %_ValueOf(arg) : ThrowDateTypeError());

つまり、v8 では Date をサブクラス化できないようです。

おすすめ記事