你会如何在JavaScript中编写Date对象?

时间:2013-04-20 17:14:24

标签: javascript date

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

让我们假装有一个名为ClockTick的裸机金属值,或类似的东西,返回毫秒。

所以Date对象既用作getter:

function Date() {
   return ClockTick;
}

和一个二传手:

function Date(milliseconds) {
}

重载:

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

问:如果没有详尽的话,你会如何在JavaScript中编写Date对象,假设没有内置的对象?

1 个答案:

答案 0 :(得分:3)

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

  1. Datenew的构造函数,还是直接调用。
  2. 传递了多少个参数。
  3. 我可能会这样做:

    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本身,并将Date的所有方法添加到Date.prototype。此方法可能更快,因为函数都在原型上共享,因此它们不会被重新创建,但这意味着值必须存储在this上,这意味着它们将对使用您的类的人公开可见。

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

    3. e.g。

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

      VS

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