A better trap than getOwnPropertyDescriptor would be something like "query" which is used to look up the attributes of a property and its existence.  JS shies away from constants generally, and especially numeric ones, but this is a place I have found really benefits from a bitfield.<div>
<br></div>const ENUMERABLE = 0x01,<div>      CONFIGURABLE = 0x02,</div><div>      WRITABLE = 0x04</div><div>      ACCESSOR = 0x08;</div><div><br></div><div>const E__ = 1,</div><div>      _C_ = 2,</div><div>      EC_ = 3,</div>
<div>      __W = 4,</div><div>      E_W = 5,</div><div>      _CW = 6,</div><div>      ECW = 7,</div><div>      ___A = 8,</div><div>      E__A = 9,</div><div>      _CA = 10,</div><div>      ECA = 11;</div><div><div>function query(target, property){</div>
<div>  // returns a value corresponding to the own property attributes, or undefined if no own property<br>}</div></div><div><br></div>"has" is removed in favor of hasOwn and proto walking<br>"hasOwn" is then replaced with query, where undefined means false and any value corresponding to a flag is true<div>
"getOwnPropertyDescriptor" becomes a "query" followed by "get" or "set" if the query result isn't undefined</div><div><br></div><div><br></div><div>The one loss is this prevents custom descriptor attributes. That seems like a fringe use case to me though. The benefit is the removal of all the traffic back and forth allocating objects and internal descriptors. It also reduces the number of traps and separates the concerns of property values from property attributes.<span></span></div>