我试图通过使用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(),并且在全局和本地上下文中查找它而没有找到它时,它最终会抛出该错误。
我甚至尝试过this
! this.getTime()
仍然:Uncaught TypeError: undefined is not a function
你们仍然可以在控制台上试试
所以我的问题是如何以正确的方式做到这一点?
答案 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>的