JavaScript对象字面量从另一个属性引用自身的另一个属性

8

我有一个对象字面量:

var obj = {
    a : document.getElementById("ex1"),
    b : obj.a.document.getElementsByTagName("div")
};

我在 b 属性方面遇到了问题,出于某些原因它不允许这样做。这种情况可能吗?


1
可能是对象字面量声明中的自引用的重复问题。 - zzzzBov
3个回答

6
现代的做法是使用getter方法来实现:getter方法。
let obj = {
  firstName: "A’dab",
  lastName: "Farooqi"
  get fullName() {
    return this.firstName+" "+this.lastName;
  },
}

现在你只需要写obj.fullName,不需要在末尾加括号。


1
鉴于JavaScript的最新更新,这应该被接受为正确答案。此外,这是一个强大的功能,应该在开发者中更广泛地传播。 - Almir Campos
赞同 - 我希望我早些时候就了解这个。对于使用通用可调用项来建立复杂配置非常有用。 - bsplosion

2
你需要两个步骤:
var obj = {
    a : document.getElementById("ex1")
};

obj.b = obj.a.document.getElementsByTagName("div")

或者:

var temp = document.getElementById("ex1")
var obj = {
    a : temp,
    b : temp.document.getElementsByTagName("div")
};

2
当定义属性b时,obj尚未定义。解决此问题的一种方法是将属性定义为函数,这样直到调用时才会被评估。
var obj = {
    a : document.getElementById("ex1"),
    b : function() {
      // This is not evaluated until obj.b() is called
      return obj.a.document.getElementsByTagName("div");
    }
};
obj.b();

如果你真的想让它成为一个属性,你需要像Tomasz Nurkiewicz所示那样分两步来做。

您可以在支持getter方法的浏览器中使用它 var obj={a:document.getElementById("ex1"),get b(){return this.a.document.getElementsByTagName("div")}}; - user123444555621
@Pumbaa80 你所说的支持它的浏览器,是指仅限于Firefox吗?更好的方法是使用Object.defineProperty,因为它在所有浏览器的最新版本中都可用,但这也需要多个步骤。 - Ruan Mendes
1
实际上,除了IE<=8之外的所有浏览器都支持它defineProperty的浏览器支持也是一样的。 - user123444555621

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接