2014-10-26 61 views
-2

我想通过使用getTime()功能将对象属性添加到JS中的Date对象。Javascript通过原型将对象添加到日期

Date.prototype.stdDate={ 
     Hour:Math.ceil(getTime()/(1000 * 3600)), 
     Day:Math.ceil(getTime()/(1000 * 3600 * 24)), 
     Week:Math.ceil(getTime()/(1000*3600*24*7)), 
     Year:Math.ceil(getTime()/(1000*3600*24*365.242)) 
    } 

,但我一直在收到此错误,而我的铬控制台上测试:

Uncaught ReferenceError: getTime is not defined 

我理解的原因是,在功能范围无法访问的getTime(),它里面的日期,当在全球和当地的背景下找到它而没有发现它时,它最终会抛出这个错误。我也尝试过thisthis.getTime()

还是:Uncaught TypeError: undefined is not a function

你们仍然可以尝试在控制台上

所以我的问题是如何做到这一点的方法不对人?

+0

在日期对象上使用getTime。 var d = new Date; d.getTime() – Fyre 2014-10-26 14:52:07

回答

2

您的代码正在尝试致电getDate作为您将其添加到专业版的那一刻输入。相反,你想稍后调用它,当这个属性被访问时。

您有两种选择:方法或带有“getters”的属性。在你的情况,我想只有一个方法:

Date.prototype.stdDate = function(part) { 
    switch (String(part).toLowerCase()) { 
     case "hour": 
      return Math.ceil(this.getTime()/(1000 * 3600)); 
     case "day": 
      return Math.ceil(this.getTime()/(1000 * 3600 * 24)); 
     case "week": 
      return Math.ceil(this.getTime()/(1000*3600*24*7)); 
     case "year": 
      return Math.ceil(getTime()/(1000*3600*24*365.242)); 
     default: 
      // What you think appropriate 
    } 
}; 

注意,这里我定义只是一个功能,stdDate,它接受一个字符串参数:

var hour = dt.stdDate("hour"); 

这是因为如果我们将stdDate引用到对象上并将方法放在对象上,则this不会再引用该日期。 (有办法解决这个问题,但它们比这里可能需要的更麻烦)。

在ES5驱动的引擎上,制作dt.stdDate.Hour和这样的工作是可能的(但可能更麻烦)

// On the prototype, define a property called `stdDate` that has a getter 
Object.defineProperty(Date.prototype, "stdDate", { 
    get: function() { 
     // This is the getter: Create an object with properties for 
     // Hour, Day, and such which have getters. The getters are 
     // "bound" to `this` using `Function#bind`: 
     var stdDate = {}; 
     Object.defineProperties(stdDate, { 
      Hour: { 
       read: function() { 
        return Math.ceil(this.getTime()/(1000 * 3600)); 
       }.bind(this), 
      }, 
      Day: { 
       read: function() { 
        return Math.ceil(this.getTime()/(1000 * 3600 * 24)); 
       }.bind(this), 
      }, 
      Week: { 
       read: function() { 
        return Math.ceil(this.getTime()/(1000*3600*24*7)); 
       }.bind(this), 
      }, 
      Year: { 
       read: function() { 
        return Math.ceil(this.getTime()/(1000*3600*24*365.242)); 
       }.bind(this) 
      } 
     }); 

     // Now, redefine the `stdDate` property on this specific instance 
     Object.defineProperty(this, "stdDate", { 
      value: stdDate 
     }); 

     // And return it 
     return stdDate; 
    } 
}); 

(你可能要与鼓捣得到它完美的工作,我冲出来的,不能马上进行调试,但这个想法是存在的。)

那是真的很费解并且可能不是一个好主意,但是如果API dt.stdDate.Hour对您来说真的很重要,那么可能是

+0

感谢您的回答!我想知道如果我做Date.stdDate = function()而不是Date.prototype.stdDate = function()它会改变什么吗? – user3135757 2014-10-26 15:06:15

+0

@ user3135757:是的,这是完全不同的。而不是将属性添加到所有'Date'实例的原型中,而是将其添加到'Date'函数;实例无法访问它(除了通过“Date.stdDate”)。 – 2014-10-26 15:18:50

3

您需要使用this.getTime()调用对象的方法.getTime()它运行于:

Date.prototype.stdDate={ 
     Hour:Math.ceil(this.getTime()/(1000 * 3600)), 
     Day:Math.ceil(this.getTime()/(1000 * 3600 * 24)), 
     Week:Math.ceil(this.getTime()/(1000*3600*24*7)), 
     Year:Math.ceil(this.getTime()/(1000*3600*24*365.242)) 
    } 

编辑:

哦,你需要将它定义为一个函数...

Date.prototype.stdDate= function() {return{ 
     Hour:Math.ceil(this.getTime()/(1000 * 3600)), 
     Day:Math.ceil(this.getTime()/(1000 * 3600 * 24)), 
     Week:Math.ceil(this.getTime()/(1000*3600*24*7)), 
     Year:Math.ceil(this.getTime()/(1000*3600*24*365.242)) 
    }} 
+0

我已经试过了:Uncaught TypeError:undefined不是函数消息:“undefined不是函数” – user3135757 2014-10-26 14:53:38

+0

已修复。你需要将它定义为一个函数。 – Scimonster 2014-10-26 14:56:06

+0

谢谢我想知道它会改变一些情况,如果你使用Date.stdDate而不是Date.prototype.stdDate – user3135757 2014-10-26 15:11:04