Javascript 如何在创建同一对象时引用该对象中的键?
假设我有这样一个对象:Javascript 如何在创建同一对象时引用该对象中的键?,javascript,json,object,Javascript,Json,Object,假设我有这样一个对象: var time = { 'second': 1000, 'minute': 1000 * 60, 'hour' : 1000 * 60 * 60, 'day' : 1000 * 60 * 60 * 24, 'week' : 1000 * 60 * 60 * 24 * 7 }; 我如何缩短它,使其引用其他键 我的意思是这样的: var time = { 'second': 1000, 'minute': t
var time = {
'second': 1000,
'minute': 1000 * 60,
'hour' : 1000 * 60 * 60,
'day' : 1000 * 60 * 60 * 24,
'week' : 1000 * 60 * 60 * 24 * 7
};
我如何缩短它,使其引用其他键
我的意思是这样的:
var time = {
'second': 1000,
'minute': this.second * 60,
'hour' : this.minute * 60,
'day' : this.hour * 24,
'week' : this.day * 7
}
我无法使用
time.foo
引用每个变量,因为变量尚未初始化。我可以简单地将它们添加到一个新命令中,例如time['hour']=time.minute*60代码>,但我宁愿在一个命令中执行。您不能执行此操作,因为对象在解析时还不存在
避免这种情况的唯一方法是创建一个对象,然后逐个添加键-因此您已经有了一个对象,该对象具有要重复使用的属性。如果您这样声明属性,则无法从其自身引用属性,因为属性尚不存在,您可能需要尝试另一种方法
var time = {};
time.second = 1000;
time.minute = time.second * 60;
...
将对象更改为构造函数,您可以执行以下操作:
function Time() {
this.second = 1000;
this.minute = this.second * 60;
this.hour = this.minute * 60;
this.day = this.hour * 24;
this.week = this.day * 7;
}
// Use
var time = new Time();
UPD
甚至更短:
var time = (function(){
var w, d, h, m, s;
w = (d = (h = (m = (s = 1000) * 60) * 60) * 24) * 7;
return {
second: s,
minute: m,
hour : h,
day : d,
week : w
};
})();
最后是这个的缩小版:
var time=function(){var a,b,c,d,e;a=(b=(c=(d=(e=1e3)*60)*60)*24)*7;return{second:e,minute:d,hour:c,day:b,week:a}}()
您可以使用大多数现代浏览器支持的getter语法:
var time = {
'second': 1000,
get minute () {
return this.second * 60;
},
get hour (){
return this.minute * 60;
},
get day (){
return this.hour * 24;
},
get week (){
return this.day * 7;
}
};
这不能用单个对象文字来完成。。有许多重复的代码,但有时找到它们可能是一个PITA。仅供参考,如果保留第一个示例中的代码,您的代码可能更可读;可能用60*60
写成3600
(每个人都知道那是一个小时)。相似:,也相似:@pst谢谢你指出这一点。事实上,我很难找到一个像我的问题。我不知道在寻找这个问题的副本时要搜索什么,因为我只是找不到合适的词来描述我想要的内容(因此标题很长)。不需要构造函数。只需使用var obj={}
创建对象,然后分配值。至少问题中的对象看起来不像是可能被重复使用的对象。@ThiefMaster-你完全正确-这不是创建“常量”的最佳方法。然而,它可读性很好,如果它像frontendmagic在他的回答中那样被包装在IIFE中,那么唯一可用的值就是一个实例(可以被视为常量)。我甚至不知道get这个东西是否存在!谢谢,但我想尽量缩短代码。;)请参阅我答案中的UPD部分=)我敢打赌没有IE版本支持这一点。我真的很喜欢你发布我问题答案的方式。我给了你答案。如果我没弄错的话,你应该从一个古老的帖子上得到一个徽章。
var time = {
'second': 1000,
get minute () {
return this.second * 60;
},
get hour (){
return this.minute * 60;
},
get day (){
return this.hour * 24;
},
get week (){
return this.day * 7;
}
};