Hi,<div><br></div><div>To address the outstanding issue of how proxies should deal with non-configurable properties, I picked up on Sean's earlier proposal, adapted it and turned it into a strawman: <<a href="http://wiki.ecmascript.org/doku.php?id=strawman:fixed_properties">http://wiki.ecmascript.org/doku.php?id=strawman:fixed_properties</a>>.</div>
<div><br></div><div>My adaptation is more permissive than the original proposal in that it still allows proxies to intercept access to non-configurable properties if they are willing to expose them as accessor rather than data properties.</div>
<div><br></div><div>This proposal would allow proxies to cover more use cases (because they can now emulate non-configurable properties), at the expense of additional complexity within proxy objects.</div><div><br></div><div>
As always, discussion and feedback are appreciated.</div><div><br></div><div>Cheers,</div><div>Tom</div><div><br><div class="gmail_quote">2011/5/4 Sean Eagan <span dir="ltr"><<a href="mailto:seaneagan1@gmail.com">seaneagan1@gmail.com</a>></span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">What:<br>
<br>
Honor attempts to make individual proxy properties non-configurable.<br>
<br>
Why:<br>
<br>
For consistency since attempts to make *all* of a proxy's properties<br>
non-configurable are honored via the "fix" trap.<br>
<br>
Example:<br>
<br>
var x = Proxy.create({<br>
  defineProperty: function() {},<br>
  getPropertyDescriptor: function() {<br>
    return {<br>
      value: "whatever I want",<br>
      writable: true,<br>
      configurable: true,<br>
      enumerable: false<br>
    };<br>
  }<br>
});<br>
Object.defineProperty(x, "foo", {value: "bar", configurable: false,<br>
writable: false, enumerable: true};<br>
<br>
/* ... */<br>
<br>
// logs "whatever I want", not "bar"<br>
console.log(x.foo);<br>
// non-writable, but doesn't throw<br>
object.foo = "baz";<br>
// non-configurable, but doesn't throw<br>
Object.defineProperty(x, "foo", {configurable: true});<br>
<br>
How:<br>
<br>
Assume a "defineProperty" trap invocation due to<br>
|Object.defineProperty(proxy, name, pd)| where |!pd.configurable|.  If<br>
return value is...<br>
<br>
  true - Henceforth bypass |proxy|'s handler for any traps with a<br>
property name parameter when the property name would be |name|<br>
  false - throw TypeError similarly to "fix" trap<br>
<br>
Update the "fix" trap semantics such that when its return value is not<br>
undefined but rather a property descriptor map, behavior is similar to<br>
|Object.defineProperties| in that improperly redefining any properties<br>
will cause a TypeError to be thrown.<br>
<br>
Notes:<br>
<br>
Can check |Object.getOwnPropertyDescriptor(proxy, name).configurable|<br>
to determine if a given proxy property is fixed since it will always<br>
be false in this case.<br>
<br>
<br>
Thanks,<br>
<font color="#888888">Sean Eagan<br>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</font></blockquote></div><br></div>