ネイティブ オブジェクト自体を変更せずに、ネイティブ 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 をサブクラス化できないようです。