【问题标题】:How to use Object Method definitions without entering infinite loop如何在不进入无限循环的情况下使用对象方法定义
【发布时间】:2017-10-06 01:16:55
【问题描述】:

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 的属性名称不变。

这可能吗?如果可以,如何正确地做到这一点?

【问题讨论】:

  • 这不过是一个语法展示(而且是一个相当混乱的展示,显示了同名的数据和访问器属性)。对于实际示例,您应该阅读the guide
  • 正确做什么?我不确定您的 o.property 的预期行为是什么。
  • 它应该返回属性property 具有的任何值,而无需进入无限循环,也无需更改属性名称或get 名称并设置为不同的名称(如_property ) 来避免这个循环。
  • 那么你需要一个简单的数据属性而不是 getter 或 setter。只需省略第二和第三行。 var o = { property(test) { return "test"; } }; o.test();
  • @Bergi 不,我想要示例中显示的内容,因为我想在分配或读取属性值时对其进行修改。

标签: javascript object initializer


【解决方案1】:

对象的属性也可以引用函数或getter 或setter 方法。

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

Getter/setter 是简单的函数,它们尊重特定的签名,并充当具有附加功能的属性,在设置/获取这些属性时可以注册这些功能。

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

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

您可以通过多种方式做到这一点,但如果您仍然需要一个不同于对象上所有其他属性的 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; }
}

但是,如果您想如此简单地增强道具的设置/获取(例如,确保您始终拥有一个数值),您需要执行以下操作:

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.

希望这会有所帮助。

【讨论】:

  • 我明白了,所以我自己的解决方案是做我一直想做的事情的正确方法,如果我想使用 getter 和 setter,就没有办法解决同名问题。
猜你喜欢
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
  • 2017-10-30
  • 1970-01-01
  • 1970-01-01
  • 2015-12-06
  • 1970-01-01
相关资源
最近更新 更多