如何在不进入无限循环的情况下使用对象方法定义
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.
希望对您有所帮助。
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.
希望对您有所帮助。