引用对象文字中先前定义的属性

时间:2011-07-11 02:36:12

标签: javascript object-literal

使用对象构造函数时,可以将属性直接分配给先前定义的属性的值:

var foo = new (function() {
   this.bar = 5;
   this.baz = this.bar;
})();
alert(foo.baz) // 5

我想引用OBJECT LITERAL中先前定义的属性:

var foo = {
   bar : 5,
   baz : bar
}
alert (foo.baz) // I want 5, but evaluates to undefined

我知道我可以这样做:

var foo = {
   bar : 5,
   baz : function() {
      alert(this.bar); // 5
   }

但是我想直接将baz分配给值而不是函数。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

不,在创建对象文字之前,您将无法使用它的任何属性。你最近的选择可能是使用像这样的临时变量:

var tmp = 5,
    foo = {
       bar : tmp,
       baz : tmp
    }

如果您可以自由使用ECMAScript 5功能,则可以为baz属性编写一个getter函数,而不是返回bar的值:

var yourObject = {
    bar: 5
};
Object.defineProperty(yourObject, 'baz', {
    get: function () { return yourObject.bar; }
});

答案 1 :(得分:1)

您也可以按部分构建文字:

var foo = {bar:5};
foo.baz = foo.bar;

如果你需要在表达式(而不是通过多个语句)中使用它,你可以尝试滥用逗号运算符或者你可以创建一个辅助函数:

(警告:未经测试的代码)

function make_fancy_object(base_object, copies_to_make){
     var i, copy_from, copy_to_list;
     for(copy_from in copies_to_make){
         if(copies_to_make.hasOwnProperty(copy_from)){
             copy_to_list = copies_to_make[copy_from];
             for(var i=0; i<copy_to_list.length; i++){
                 base_object[copy_to_list[i]] = base_object[copy_from];
             }
          }
      }
}

var foo = make_fancy_object(
    {bar: 5},
    {bar: ["baz", "biv"]}
);

//foo.baz and foo.biv should be 5 now as well.