由于两个吸气剂引起的无限循环?

时间:2016-11-05 22:57:08

标签: javascript properties accessor

以下代码执行无限循环(打印getter1一次,然后getter2直到停止):

var person1 = {
    _age: 42,
    get age() {
      console.log("getter1");
      return this._age;
    }
};

Object.defineProperty(person1, "_age", {
    get: function() {
      console.log("getter2");
      return this._age;
  }
});
console.log(person1.age); // true

是什么原因造成的? (注意:我知道我宣布两个不同的吸气剂)。

3 个答案:

答案 0 :(得分:1)

它不是无限循环,而是无限递归。您在this._age的getter中返回_age,但访问this._age会隐式调用getter。

请注意,一旦定义了名为_age的getter,就会覆盖_age(42)的旧值。没有值为42的属性。如果你想创建一个返回属性值的getter,它不能是同一个属性的getter,所以将你的getter命名为_age以外的东西:

var person1 = {
    _age: 42,
    get age() {
      console.log("getter1");
      return this._age;
    }
};

Object.defineProperty(person1, "age2", {
    get: function() {
      console.log("getter2");
      return this._age;
  }
});
console.log(person1.age); // 42
console.log(person1.age2); // 42

答案 1 :(得分:0)

每次从getter返回一个值时,你都会触发另一个getter

答案 2 :(得分:0)

你的第一个吸气器要求this._get这会触发第二个吸气器,它要求this._get触发第二个吸气器,它要求this._get,这触发......你得到重点。