Object.defineProperty with { get: undefined, set: undefined }

Allen Wirfs-Brock Allen.Wirfs-Brock at microsoft.com
Mon Aug 3 18:39:01 PDT 2009

Good one, I surprised that this has never come up before. I don't think there is anything intentional about the current design, it just fell out.

Such a property would have pretty much the same effect as
Object.defineProperty(obj, propname, { value: undefined})

which creates a readonly, nonenumerable, nonconfigurable property whose value is undefined. There isn't much (if any, I need to look a litter deeper) real behavioral difference between such a data property and the equivalent accessor property except for what can be observed using Object.getOwnPropertyDescriptor.

I suppose we could put more conditions into [[DefineOwnProperty]] to reject accessors where both [[Get]] and [[Put]] are undefined. Do you think this is a significant issue?  Is it an error that is likely to be made?  [[DefineOwnPropoerty]] is already fairly complicated so unless there is some real hazard to allowing such properties I'm inclined to leave it as is.


>-----Original Message-----
>From: es-discuss-bounces at mozilla.org [mailto:es-discuss-
>bounces at mozilla.org] On Behalf Of Jeff Walden
>Sent: Monday, August 03, 2009 4:35 PM
>To: es-discuss at mozilla.org
>Subject: Object.defineProperty with { get: undefined, set: undefined }
>  Object.defineProperty(obj, propname, { get: undefined, set: undefined
>Assuming obj has no property named by propname (whether it does or not
>is basically irrelevant to this question), the given expression
>apparently defines a property with this property descriptor:
>   {
>     [[Get]]: undefined,
>     [[Set]]: undefined,
>     [[Enumerable]]: false,
>     [[Configurable]]: false
>   }
>The effect of getting such a property is to return undefined; setting it
>either has no effect or throws, depending on the precise code construct
>being used.
>Anyway: what exactly is the meaning of a descriptor whose [[Get]] and
>[[Set]] fields are both |undefined|?  Merely [[Set]] being |undefined|
>has a sensible meaning (readonly yet not necessarily constant property).
>Merely [[Get]] being |undefined| makes less sense -- one-way
>communication with an object via property setting, rather than by a
>method call? -- but okay, I can accept it as plausibly useful.  But both
>[[Get]] and [[Set]] being undefined?  I don't see the purpose or
>rationale behind it.  Could someone enlighten me?
>es-discuss mailing list
>es-discuss at mozilla.org

More information about the es-discuss mailing list