如何使用对象方法的定义,而不进入无限循环
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的属性名称。
这是可能的,如果是的话如何正确地做到这一点?
对象的属性也可以指函数或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,那么没有办法解决同名问题。 – Shadow
这只不过是一个语法展示(而且相当混乱,同时显示数据和访问者属性都具有相同的名称)。对于实际的例子,你应该阅读[指南](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects) – Bergi
做*什么*正确?我不确定你的'o.property'的预期行为是什么。 – Bergi
它应该返回属性'property'所具有的值,而不必进入无限循环而不必更改属性的名称或get的名称并将其设置为不同的内容(如'_property')以避免此循环。 – Shadow