我有以下代码:
var o = {};
o.a = 1;
var _value = 1;
Object.defineProperty(o,"a",{
set: function(value){
_value = value + 1;
console.log("log: ", value, _value);
return _value;
},
get: function(){
return _value;
}
});
字符串
在setter方法中,我在返回_value
之前将其递增1。因此,如果我设置o.a = 5
,我希望控制台打印6
(即使我意识到从setter返回值通常没有意义)。然而,如以下片段所示,控制台打印5
:
> o.a = 5;
log: 5 6 // from console.log;
5 // return; why does it == value and not value + 1?
> o.a;
6
> var i = o.a = 5;
> i;
5
> o.a;
6
型
那么我的问题是为什么它返回5
而不是6
?
我希望这不是因为我在代码中犯了一些愚蠢的错误。
4条答案
按热度按时间dz6r00yl1#
你不能从属性设置器返回任何东西,而只是得到赋值的值(它是
5
,因为你赋值了5
)。setter中的return是做什么的?
什么都没有。最好删除
return
语句。最好忽略它。l2osamch2#
让我们来看看 * 简单的赋值 *:
11.13.1简单赋值(=)
结果 AssignmentExpression:LeftHandSideExpression = AssignmentExpression 的计算如下:
1.令 lref 为计算 LeftHandSideExpression 的结果。
1.令 rref 为计算 AssignmentExpression 的结果。
1.设 rval 为GetValue(rref)。
所以
rval
被赋给了将要被赋给左手的值(o.a
)。在你的例子中是5
。1.如果以下条件都为真,则抛出SyntaxError异常:[...]
1.调用PutValue(lref,rval)。
这是将值赋给左手侧(
PutValue(o.a, 5)
)的地方。正如你所看到的,PutValue
返回的值没有任何作用(它不返回任何东西)。1.返回 rval。
它简单地返回分配的值,在您的情况下为
5
。赋值表达式始终返回已赋值的值。
holgip5t3#
赋值表达式的值总是等于被赋值的值:
字符串
这是真的,不管你要赋值的对象是变量、普通属性、setter、只读属性还是其他什么:
型
正如你自己所说的,setter中的返回值是没有意义的,所以当你在setter中使用返回值时,为什么你期望它实际上做一些特殊的事情呢?回答你的问题 “return语句在setter中做什么?" -基本上什么都没有。它计算
return
右边的表达式,然后丢弃结果。m528fe3b4#
这在某种程度上取决于你为什么要这样做。我个人有一组枚举,但其中一个有一个边缘情况,为边缘情况设置一个例外会在我的API中产生不一致。我想我会用一个返回值的setter来伪造它,但正如你所发现的那样,这不起作用。
这个问题的一个潜在的解决方案是使用带代理的getter。* 这意味着你没有像你要求的那样从setter返回 *,但是下面的代码将显示为什么这可能正是你实际需要的。
我遇到的问题是:捕获一个鼠标按钮并返回一个友好的名称。如果它是0-2,则返回以下之一:'MouseClickLeft','MouseClickRight','MouseClickMiddle'。否则,返回一个动态数字,如'MouseClick 4','MouseClick 5'等。使其像枚举一样工作,以保持API与其他枚举一致。
字符串
输出示例:
型
上面我使用了数字转换为字符串,但文本字符串的工作方式相同。