我试图在一点上理解ECMAScript 2015规范:Internal Slots of Objects。但这部分对我来说显得很不清楚,尤其是这句话:
内部插槽对应于与对象关联并由各种ECMAScript规范算法使用的内部状态。
(它是否使用正确的语法?)任何人都可以用英语解释这个概念吗?
到目前为止我能理解的是:
undefined
答案 0 :(得分:15)
内部插槽/方法是伪属性/方法,规范用它来定义所需的行为。 ("抽象操作"是规范的相关机制。)插槽表示状态(值),方法描述算法(行为)。它们可能对应于引擎使用的对象的属性,也可能不对应,但除了公共API的某些部分公开之外,它们对用户代码不可用。引擎使用的实际实现可能与内部方法草拟的内容大不相同,但为了符合要求,它们必须产生与内部方法一致的行为或结果。
[[StringData]]
内部插槽 String
的行为,例如new String("whatever")
,用包含[[StringData]]
内部插槽的术语来描述,该插槽代表值(在这种情况下为whatever
)。内部插槽不能直接访问用户代码,但String.prototype.toString()
(例如(new String("whatever")).toString()
)是根据thisStringValue()
抽象操作定义的,这是根据返回的值[[StringData]]
。换句话说,String.prototype.toString()
是公共API,它本质上是一个公开[[StringData]]
的getter。
[[OwnPropertyKeys]]
内部方法 Object.keys()
的行为用包含调用[[OwnPropertyKeys]]
内部方法的术语来描述。请注意,不同类型的对象(例如普通对象(例如Object
)和外来对象(例如String
)可能具有[[OwnPropertyKeys]]
的不同定义。当[[OwnPropertyKeys]]
被称为""在规范中,它指的是适用类型的定义。还有一些invariant特性适用于任何对象类型的定义。
答案 1 :(得分:3)
它只是一种技巧,能够准确描述物体的行为方式。
它们不是对象的真实成员,即使在某些实现中,您也不允许使用可移植代码访问它们。
换句话说,它是一种编写规范的方法,该规范允许使用命令式代码描述行为,这种代码正式更精确,只需使用罗嗦的自然语言"描述行为应该是什么。