递归属性,使用其他属性

时间:2016-02-20 16:06:30

标签: javascript

我正在尝试构建一个js对象,该属性可以引用同一对象中的另一个属性,这可能吗?这是我的想法,但它不起作用,希望我足够清楚:

var docs = {
   a: { properties: [1, 2] },
   b: { properties: [3] },
   c: { properties: docs.a.properties.concat(docs.b.properties) }
};

document.write(docs.c.properties);

控制台说它找不到docs.a

  

未捕获的TypeError:无法读取未定义的属性“a”。

2 个答案:

答案 0 :(得分:5)

您不能这样做,因为尚未创建对象docs。您可以执行以下操作:

var docs = {
   a: { properties: [1, 2] },
   b: { properties: [3] }
}
docs.c = { properties: docs.a.properties.concat(docs.b.properties) };

document.write(docs.c.properties);

或者,您可以这样做:(摘自this answer

var docs = {
   a: { properties: [1, 2] },
   b: { properties: [3] },
   init: function() {
       docs.c = { properties: docs.a.properties.concat(docs.b.properties) };
       return this;
   }
}.init();

答案 1 :(得分:2)

假设您希望c 始终镜像ab,而不仅仅是在开始时,您可以使用getter来定义它功能:

var docs = {
   a: { properties: [1, 2] },
   b: { properties: [3] },
   get c() {
       return { properties: docs.a.properties.concat(docs.b.properties) };
   }
};
console.log(docs.c.properties.join(", ")); // "1, 2, 3"



var docs = {
   a: { properties: [1, 2] },
   b: { properties: [3] },
   get c() { return { properties: docs.a.properties.concat(docs.b.properties) }; }
};
snippet.log("a: " + JSON.stringify(docs.a));
snippet.log("b: " + JSON.stringify(docs.b));
snippet.log("c: " + JSON.stringify(docs.c));

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;

请注意,c 的每次访问都会创建一个新对象和一个新的连接数组,因此效率不高。但如果你想要它是动态的......

或者因为它只是c.properties你真的需要一个吸气剂:

var docs = {
   a: { properties: [1, 2] },
   b: { properties: [3] },
   c: { get properties() {
           return docs.a.properties.concat(docs.b.properties);
        }
      }
};
console.log(docs.c.properties.join(", ")); // "1, 2, 3"

&#13;
&#13;
var docs = {
   a: { properties: [1, 2] },
   b: { properties: [3] },
   c: { get properties() {
           return docs.a.properties.concat(docs.b.properties);
        }
      }
};
snippet.log("a: " + JSON.stringify(docs.a));
snippet.log("b: " + JSON.stringify(docs.b));
snippet.log("c: " + JSON.stringify(docs.c));
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;

在那里,每次都会重新创建c.properties,而不是c本身。