如何在不进入无限循环的情况下使用对象方法定义

How to use Object Method definitions without entering infinite loop

On MDN 有一个示例显示了在对象初始化时使用的 get 和 set:

var o = {
  property: function ([parameters]) {},
  get property() {},
  set property(value) {}
};

没有任何示例说明如何使用该结构,我总是进入无限循环,例如:

var o = {
  property: function (test) {return "test"},
  get property() {return this.property;},
  set property(value) {this.property = value;}
};

当我尝试访问名为 property 的对象 属性 时,无限循环开始,我认为这是因为 get 在尝试读取 属性 时也会触发自身.

console.log(o.property); // infinite loop occurs

所以我假设我做错了,但在那种情况下,该网页上的示例不是很清楚。我找到的临时解决方案是将值保存在类似的 属性(例如 _property)中,但我不想这样做并保持对象的 属性 名称完整, getter 和 setter.

这可能吗?如果可以,如何正确执行?

A property of an object can also refer to a function or a getter or setter method.

有点混乱,但请注意 OR。这里的意思是您可以拥有引用函数的对象的属性,或者您可以拥有引用 getter/setters.

的对象的属性

Getter/setters 只是尊重特定签名的函数,并且充当具有附加功能的属性,可以在 setting/getting 这些属性时注册。

通常这些仅用于基于对象的其他状态属性的计算值。

但是,在某些情况下,您确实可以使用它们来添加一些功能/预先计算,例如在设置值时。

您可以通过多种方式做到这一点,但如果您仍然需要一个 getter/setter 不同于对象上所有其他属性的名称。

所以例如有这样的东西

var o = {
  prop: 0.6
}

如果你想添加一些东西,比如访问类似百分比的值,你可以这样做:

var o = {
  prop: 0.6,
  get propPerc() { return this.prop * 100; },
  set propPerc(val) { this.prop = this.val / 100; }
}

但是如果你想简单地增强 prop 的 setting/getting(例如确保你始终有一个数值),你需要做如下事情:

var o = {
  _prop: 0.6,
  get prop() { return this._prop || 0; },
  set prop(val) { this._prop = this.val || 0; }
}

您需要与 get/set 属性 不同的属性名称。不幸的是,对于外部来说,这两个属性都是可见的,所以如果你使用这种方法,不直接使用 _prop 是一个约定俗成的问题,因为 JS 本身没有私有属性。

但是,您可以使用符号模拟类似私有属性的东西,例如:

var propSymbol = Symbol('prop');

var o = {
  get prop() { return this[propSymbol] || 0; },
  set prop(val) { this[propSymbol] = this.val || 0; }
}
o[propSymbol] = 0.6; // can only do it here, assuming this piece of code is not accessible to outside and propSymbol is just a local variable.

希望对您有所帮助。