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プロパティのゲッター関数を記述して、代わりに次の値を返すことができ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 に答える