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