Search code examples
javascriptecmascript-5

ES5 spec the Object type


I'm reading through the ES5 spec and got a bit confused about the following piece:

8.6 The Object Type

... There are two kinds of access for named (non-internal) properties: get and put, corresponding to retrieval and assignment, respectively.

Can someone clarify what this phrase refers to exactly (what is its meaning?)? I have only seen the named accessor properties get and set.


Solution

  • The spec is saying that putting and getting are two actions that can happen to properties. Objects have the internal methods [[Put]] and [[Get]] that correspond to those actions.

    [[Put]] is an internal method, present within every object, that stores values in an object's properties. Any time you perform an assignment operation on a property, you cause the environment to perform a [[Put]].

    [[Set]] is the internal property of an accessor property descriptor. This is what you define when you define a set setter function of an accessor property. (Note: [[Set]] exists on property descriptors, not on objects. Not all properties have a [[Set]], but all objects do have a [[Put]].)

    If you attempt to perform a [[Put]] on an object property which is an accessor property, that operation will invoke the property's [[Set]] function, per step 5 of the [[Put]] algorithm:

    1. If IsAccessorDescriptor(desc) is true, then

      • a. Let setter be desc.[[Set]] which cannot be undefined.
      • b. Call the [[Call]] internal method of setter providing O as the this value and providing V as the sole argument.

    In short, the function [[Set]] only applies to accessor properties, while [[Put] can apply to either accessor or data properties.