On May 20, 2010, at 11:37 AM, Irakli Gozalishvili wrote: > Hi, > > Sorry if my question is stupid or does not really belongs here. I will be > thankful to get some clarification on es specs since I just discovered that > my interpretation of how getter / setters are supposed to behave appears to > be different from the behavior in observed in modern browsers. > > var foo = Object.create({}, { > bar: { > get: function() { > return this._foo; > }, > set: function(value) { > return this._foo = 'Hello ' + value; > } > } > }); > > var bar = foo.bar = 'setter'; > if (foo.bar !== bar) throw new Error('Unexpected'); > > The code will throw an error cause bar will be 'setter' while foo.bar will be > 'Hello setter'. I was expecting that `bar' would've get value returned by a > setter (or at least getter of foo). And this is not the case nor with FF nor > with Safari implementations. Behavior is the same if getters and setters are > used instead. Is it expected behavior ? If answer is yes, is there any point > of returning anything from setter ? There is no point in returning anything from a setter.
This is due to the semantics of the assignment operator, not setters -- the result value of an assignment is the righthand side of the expression. eg. for any expression <some lvalue> = someObject.property = <expr> the behaviour is equivalent to temp = <expr> someObject.property = temp <some lvalue> = temp (ignoring the need to resolve the destinations in the correct order) > I am also afraid that this might break some of the frameworks in rare cases > like in this example above. (a = b = c is commonly used syntax) This has always been the behaviour of assignment. --Oliver _______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss