2

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

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 直接分配给一个值而不是一个函数。有任何想法吗?

4

2 回答 2

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; }
});
于 2011-07-11T02:56:29.620 回答
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.
于 2011-07-11T03:36:45.030 回答