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

时间:2015-10-12 07:15:32

标签: javascript object ecmascript-6

我试图在一点上理解ECMAScript 2015规范:Internal Slots of Objects。但这部分对我来说显得很不清楚,尤其是这句话:

  

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

(它是否使用正确的语法?)任何人都可以用英语解释这个概念吗?

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

  • 内部广告位不是属性
  • 内部插槽在创建对象期间使用,但未添加到对象本身
  • 内部广告位是,最初为undefined

2 个答案:

答案 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)

它只是一种技巧,能够准确描述物体的行为方式。

它们不是对象的真实成员,即使在某些实现中,您也不允许使用可移植代码访问它们。

换句话说,它是一种编写规范的方法,该规范允许使用命令式代码描述行为,这种代码正式更精确,只需使用罗嗦的自然语言"描述行为应该是什么。