Javascript通过prototype将对象添加到最新版本

Javascript通过prototype将对象添加到最新版本,javascript,Javascript,我试图通过使用getTime()功能向JS中的日期对象添加一个对象属性 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

我试图通过使用
getTime()
功能向JS中的日期对象添加一个对象属性

 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(),当在全局和本地上下文中查找它而未找到时,它最终会抛出该错误

我甚至用
这个
试过
this.getTime()

仍然:
uncaughttypeerror:undefined不是函数

你们还可以在控制台上试试


所以我的问题是如何以正确的方式来做,伙计们

您需要使用
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))
    }}
当您将
getDate
添加到原型中时,您的代码正在尝试调用它。相反,您希望稍后在访问属性时调用它

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

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
引用一个对象并在该对象上放置方法,
这个
将不再引用日期。(有很多解决方法,但它们比这里可能保证的更麻烦。)

在启用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
对您来说真的很重要,那么,这是可能的。

对日期对象使用getTime。var d=新日期;d、 getTime()我已经尝试过:Uncaught TypeError:undefined不是函数消息:“undefined不是函数”已修复。你需要将它定义为一个函数。谢谢。我想知道如果你使用Date.stdDate而不是Date.prototype.stdDateYes,它会改变什么吗。那么它将是
Date
的静态属性,而不是
Date
实例上可用的原型属性。谢谢老兄,你真的帮助了我!谢谢你的回答!我想知道如果我用Date.stdDate=function()而不是Date.prototype.stdDate=function()的话,它会改变什么吗?@user3135757:是的,那会完全不同。将属性添加到
Date
函数中,而不是将其添加到所有
Date
实例的原型中;实例将无法访问它(除非通过
Date.stdDate
)。