什么是JavaScript中对象的"内部插槽"?

Bai*_*Dev 18 javascript object ecmascript-6

我试图在一点上理解ECMAScript 2015规范:对象的内部插槽.但这部分对我来说显得很不清楚,特别是这句话:

内部插槽对应于与对象关联并由各种ECMAScript规范算法使用的内部状态.

(它使用正确的语法吗?)有人能用英语解释这个概念吗?


到目前为止我能理解的是:

  • 内部插槽不是属性
  • 内部插槽在创建对象期间使用,但不会添加到对象本身
  • 最初,内部插槽是或​​具有undefined

JMM*_*JMM 18

摘要

内部插槽/方法是伪属性/方法,规范用它来定义所需的行为.("抽象操作"是规范的相关机制.)插槽表示状态(值),方法描述算法(行为).它们可能或可能不对应于引擎使用的对象的属性,但它们不可用于用户代码,除非公共API的某些部分公开.引擎使用的实际实现可能与内部方法草拟的内容大不相同,但为了符合要求,它们必须产生与内部方法一致的行为或结果.

例子

[[StringData]] 内部插槽

String例如new String("whatever"),以包括[[StringData]]表示值的内部槽(whatever在这种情况下)的术语来描述行为.用户代码不能直接访问内部槽,但是String.prototype.toString()(例如(new String("whatever")).toString())是根据thisStringValue()抽象操作定义的,抽象操作是根据返回值来描述的[[StringData]].换句话说,String.prototype.toString()公共API本质上是一个公开的getter [[StringData]].

[[OwnPropertyKeys]] 内部方法

Object.keys()在包括调用[[OwnPropertyKeys]]内部方法的术语中描述了行为.注意,不同种类的对象,例如普通对象(例如Object)和外来对象(例如String)可能具有不同的定义[[OwnPropertyKeys]].当[[OwnPropertyKeys]]在规范中"调用"时,它指的是适用类型的定义.还有一些不变特征适用于任何对象类型的定义.