如何从Javascript Date Object继承?

时间:2011-08-21 21:53:15

标签: javascript

我正在尝试创建和继承Date对象的对象。

以下是我想要做的Firebug成绩单。

>>> date_son = Object.create( Date )
Function {}
>>> typeof date_son
"object"
>>> date_son.gettime
undefined
>>> date_son.prototype.getTime
getTime()

我使用Object.create创建一个继承自Date的对象date_son。 getTime函数/属性在date_son.protype上可用,但在date_son对象本身上没有。

我显然做错了什么。任何人都可以指出我正确的方向如何创建一个继承自Date的对象,以便date_son.getTime()在date_son对象上可用。

我不希望直接扩展Date,因为我认为搞乱/改变全局变量是糟糕的编程习惯。

3 个答案:

答案 0 :(得分:2)

Mozilla(https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date)对MDN文档进行了说明:

  

注意:请注意,Date对象只能通过调用Date或将其用作构造函数来实例化;与其他JavaScript对象类型不同,Date对象没有文字语法。

Object.create期望在给出参数时的实例。 Date本身不是实例,因此不能与Object.create一起使用。

此外,要解决直接延长日期的问题:

扩展本机对象是经常进行的。 MooTools使用他们自己的.implement方法来做到这一点:

https://github.com/mootools/mootools-more/blob/master/Source/Types/Date.js#L55

关于扩展原生代的教程:

http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-how-to-extend-built-in-objects-in-javascript/

修改

还有一篇关于扩展当地人的假定弊端的文章:http://perfectionkills.com/extending-built-in-native-objects-evil-or-not/

答案 1 :(得分:1)

你可以这样做:

var date_son = Object.create( Date.prototype );

但似乎没有多大好处,因为你会在Date之外的其他方面调用这些方法。

console.log( date_son.getTime() );  // won't work

你可以这样称呼,但我不知道你为什么要这样做:

var date_son = Object.create( Date.prototype );

var new_date = new Date();

console.log( date_son.getTime.call( new_date ) );  // 1313964470748

如果您想添加一些Date实用程序,并且不想扩展Date.prototype,那么只需创建一个接受Date对象的方法库。

var date_son = {
    some_method: function( d ) {
        // do something with the date
        return d;
    }
};

var date = date_son.some_method( new Date );

答案 2 :(得分:0)

好消息!这可以与ES5中引入的新的基于类的语法一起使用。

class DateSon extends Date {
    equals(other) {
        if (typeof other === "object") {
            return this.getTime() === other.getTime();
        } else {
            return false;
        }
    }

    copy() {
        return new Date(this.getTime());
    }
}

dateSon1 = new DateSon();
dateSon2 = dateSon1.copy();
dateSon2.setDate(dateSon1.getDate() + 1);

console.log(dateSon1.equals(dateSon2));