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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

我试图在一点上理解ECMAScript 2015规范:内部槽对象。但是这一节对我来说似乎很不清楚,特别是这句话:

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

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

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

  • 内部插槽不是属性
  • 内部插槽在创建对象时使用,但不会添加到对象本身
  • 内部狭槽是或者有,最初undefined
提问于
用户回答回答于

这只是一种技巧,曾经能够精确地描述物体应该如何表现。

他们不是对象的真正成员,即使在某些实现中,他们也不允许用便携式代码访问它们。

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

用户回答回答于

概要

内部插槽/方法是规范用来定义所需行为的伪属性/方法。(“抽象操作”是规范的相关机制。)插槽表示状态(值),方法描述算法(行为)。它们可能与引擎使用的对象的属性相对应,也可能不对应,但它们不可用于用户代码,除非公开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]]被“叫”的规范,是指定义适用的类型。还有一些适用于任何对象类型的定义的不变特征。

扫码关注云+社区