如何使用对象方法的定义,而不进入无限循环

问题描述:

On MDN有证据显示得和对象初始化中使用的标本例如:如何使用对象方法的定义,而不进入无限循环

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对象属性无限循环开始,我以为是因为在尝试读取它获得的属性时,也触发本身。

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

所以我假设我这样做不对,但在这种情况下,该网页上的例子也不是很清楚。我发现的临时解决方案是将值保存在一个类似的属性中(例如_property),但我不想这样做,并保留对象,getter和setter的属性名称。

这是可能的,如果是的话如何正确地做到这一点?

+0

这只不过是一个语法展示(而且相当混乱,同时显示数据和访问者属性都具有相同的名称)。对于实际的例子,你应该阅读[指南](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects) – Bergi

+0

做*什么*正确?我不确定你的'o.property'的预期行为是什么。 – Bergi

+0

它应该返回属性'property'所具有的值,而不必进入无限循环而不必更改属性的名称或get的名称并将其设置为不同的内容(如'_property')以避免此循环。 – Shadow

对象的属性也可以指函数或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. 

希望这有助于。

+0

我明白了,所以我自己的解决方案是做我想做的事情的正确方法,如果我想使用getter和setter,那么没有办法解决同名问题。 – Shadow