Javascript通过原型将对象添加到Date

时间:2014-10-26 14:49:18

标签: javascript

我试图通过使用getTime()功能向JS中的Date对象添加对象属性。

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

但是我在Chrome控制台上测试时一直收到此错误:

 Uncaught ReferenceError: getTime is not defined

我理解原因是函数中的作用域无法访问Date内部的getTime(),并且在全局和本地上下文中查找它而没有找到它时,它最终会抛出该错误。

我甚至尝试过thisthis.getTime()

仍然:Uncaught TypeError: undefined is not a function

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

所以我的问题是如何以正确的方式做到这一点?

2 个答案:

答案 0 :(得分: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))
    }}

答案 1 :(得分: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对你真的很重要,那么,可能< / em>的