我正在尝试创建和继承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,因为我认为搞乱/改变全局变量是糟糕的编程习惯。
答案 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://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));