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;
}
});
(您可能需要对其进行修补以使其完美工作;我正在进行快速调试,现在无法调试它。但想法就在那里。)
这是非常复杂的,可能不是一个好主意,但是如果APIdt.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
)。