ES5 规范对象类型

ES5 spec the Object type

我正在通读 ES5 规范,对以下内容有点困惑:

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.

谁能解释一下这个短语到底指的是什么(它的意思是什么?)? 我只看到了命名访问器属性 getset

它指的是您访问数据的方式,而不是函数名称。它本质上是在解释 ES5 对象可以以类似的方式访问属性以进行写入,如 myObject.property = 5 和 myObject['property'] = 5 或读取。它说 "non-internal" 因为内部属性只能通过使用原型来放置。

规范说 puttinggetting 是可能发生在属性上的两个动作。 Objects have the internal methods [[Put]] and [[Get]] 对应于这些操作。

[[Put]] 是一种内部方法,存在于每个对象中,将值存储在对象的属性中。任何时候对 属性 执行赋值操作,都会导致环境执行 [[Put]].

[[Set]] 是访问器 属性 描述符的内部 属性。这就是你在定义访问器 属性 的 set setter 函数时定义的内容。 (注意:[[Set]] 存在于 属性 描述符 上,而不存在于对象上。并非所有属性都有 [[Set]],但所有对象都有 [[Put]]。)

如果您尝试对作为访问器 属性 的对象 属性 执行 [[Put]],该操作将调用 属性 的 [[Set]] 函数,根据 [[Put]] 算法的第 5 步:

  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.

简而言之,函数 [[Set]] 仅适用于访问器属性,而 [[Put] 可以应用于访问器或数据属性。