Date对象可能很好地说明了如何在JavaScript中创建对象。 它有太多的方法使它成为一个简洁的例子,但我想看看如何构造这样一个对象的框架。
让我们假装有一个名为ClockTick的裸机金属值,或类似的东西,返回毫秒。
所以Date对象既用作getter:
function Date() {
return ClockTick;
}
和一个二传手:
function Date(milliseconds) {
}
重载:
function Date(year, month, day, hours, minutes, seconds, milliseconds) {
}
问:如果没有详尽的话,你会如何在JavaScript中编写Date对象,假设没有内置的对象?
答案 0 :(得分:3)
对于您提供的基本示例,您基本上想要检查两件事:
Date
是new
的构造函数,还是直接调用。我可能会这样做:
function Date(year, month, day, hours, minutes, seconds, milliseconds){
if (!(this instanceof Date)){
// If 'this' is not a Date, then the function was called without 'new'.
return /* current date string */
}
if (arguments.length === 0) {
// Populate the object's date with current time
} else if (arguments.length === 1){
// Populate the object's date based on 'arguments[0]'
} else {
// Populate the object's date based on all of the arguments
}
}
就代表实际日期值而言,它真的取决于你。只定义了外部接口,因此您可以将其存储为时间戳,或者将日/月/年等单独的值存储。
在存储值方面,您有几个选项:
您可以将值存储在this
本身,并将Date
的所有方法添加到Date.prototype
。此方法可能更快,因为函数都在原型上共享,因此它们不会被重新创建,但这意味着值必须存储在this
上,这意味着它们将对使用您的类的人公开可见。
您可以将值存储在日期构造函数中的第二个对象上,然后将所有Date
函数分配到构造函数内的this
,捕获对日期值对象的引用。这具有隐藏内部值的优点,但意味着您需要为每个创建的新Date
对象重新创建函数。
e.g。
function Date(...){
this.dayPrivate = day;
}
Date.prototype.getDay = function(){
return this.dayPrivate;
};
VS
function Date(...){
this.getDay = function(){
return day;
};
}