【问题标题】:ES5 spec the Object typeES5 规范对象类型
【发布时间】:2016-01-02 11:02:06
【问题描述】:

我正在阅读 ES5 规范,对以下内容感到有些困惑:

8.6 对象类型

... 命名(非内部)属性有两种访问方式:get 和 put,分别对应于检索和赋值。

有人能澄清一下这句话的确切含义吗(它的含义是什么?)? 我只看到了命名访问器属性getset

【问题讨论】:

  • 它是内部的。当您设置属性时,会调用 put 操作。 ES 2015 规范不再使用 put 一词。
  • @zeroflagL 好的,所以我可以假设putset 在这里使用的上下文相同?
  • 是的。如果您继续阅读,您会发现内部 put 方法的描述,即 “设置指定的命名属性”

标签: javascript ecmascript-5


【解决方案1】:

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

【讨论】:

  • 谢谢,这部分我明白了。我真正想知道的是为什么他们使用put 而不是set。我可以假设它们在相同的上下文中使用吗?
  • 可能是同一件事,考虑到上下文,因为他们使用的是通用词(种类),而不是使用任何标记。
  • 你最后一句话是什么意思?
  • 我的意思是“kind”是一种非正式的谈论访问者的方式。它们不必像标准所说的那样被称为内部属性不是 ES5 的一部分。
【解决方案2】:

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

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

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

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

  1. 如果 IsAccessorDescriptor(desc) 为真,则

    • 一个。设 setter 为 desc.[[Set]],它不能是未定义的。
    • 乙。调用 setter 的 [[Call]] 内部方法,提供 O 作为 this 值并提供 V 作为唯一参数。

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

【讨论】:

  • 好吧,它们毕竟不是一回事。酷!
  • 对您的短语有点困惑:如果您尝试对对象属性执行 [[Put]]... 我假设您的意思是运行时环境本身(我们不能直接访问它? )。
  • @KimGysen 是的,完全正确。我只是编辑得更清楚,我希望。
猜你喜欢
  • 2019-04-26
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
相关资源
最近更新 更多