2

Date 对象可能很好地说明了如何在 JavaScript 中创建对象。它有太多的方法使它成为一个简洁的例子,但我想看看如何构建这样一个对象的框架。

让我们假设有一个裸机值,称为 ClockTick 或类似的东西,它返回毫秒。

因此 Date 对象同时用作 getter:

function Date() {
   return ClockTick;
}

和一个二传手:

function Date(milliseconds) {
}

重载:

function Date(year, month, day, hours, minutes, seconds, milliseconds) {
}

问:如果不详尽,假设还没有内置 Date 对象,您将如何在 JavaScript 中编写 Date 对象?

4

1 回答 1

3

对于您提供的基本示例,您基本上要检查两件事:

  1. Date作为构造函数调用,new或直接调用。
  2. 传递了多少个参数。

我可能会做这样的事情:

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
    }
}

至于表示实际的日期值,这完全取决于您。仅定义了外部接口,因此您可以将其存储为时间戳,或单独的日/月/年值等。

在存储值方面,您有几个选择:

  1. 您可以将值存储在自身上this,并添加 on 的所有方法。这种方法可能更快,因为函数都在原型上共享,因此它们不会被重新创建,但这意味着必须存储值,这意味着它们将对使用您的类的人公开可见。DateDate.prototypethis

  2. 您可以将值存储在日期构造函数内的第二个对象上,然后将所有Date函数分配到this构造函数内,捕获对日期值对象的引用。这有隐藏内部值的好处,但意味着您需要为创建的每个新Date对象重新创建函数。

例如

function Date(...){
   this.dayPrivate = day;
}

Date.prototype.getDay = function(){
   return this.dayPrivate;
};

对比

function Date(...){
    this.getDay = function(){
       return day;
    };
}
于 2013-04-20T17:41:18.663 回答