Ссылаясь на ранее определенные свойства в литерале объекта - PullRequest
2 голосов
/ 11 июля 2011

При использовании конструкторов объектов свойства могут быть напрямую назначены значению ранее определенных свойств:

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

Я хотел бы сослаться на ранее определенное свойство внутри ОБЪЕКТА ЛИТЕРАЛЬНЫЙ:

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 ]

3 голосов
/ 11 июля 2011

Нет, вы не сможете использовать какие-либо свойства литерала объекта до его создания.Ближайшим вариантом, вероятно, является использование временной переменной, например:

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

Если вы можете использовать функции ECMAScript 5, вы можете написать функцию получения для свойства baz, которая вместо этого возвращаетзначение bar:

var yourObject = {
    bar: 5
};
Object.defineProperty(yourObject, 'baz', {
    get: function () { return yourObject.bar; }
});
1 голос
/ 11 июля 2011

Вы также можете просто построить литерал по частям:

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.
...