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

IT技术 javascript object ecmascript-6
2021-02-28 00:21:03

我试图通过一点来理解 ECMAScript 2015 规范:对象的内部插槽但是这一段我觉得很不清楚,尤其是这句话:

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

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


到目前为止我能理解的:

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

概括

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

例子

[[StringData]] 内部插槽

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

[[OwnPropertyKeys]] 内部方法

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

@JMM 你是说在 JS 引擎深处,他们已经实现了一些与[[OwnPropertyKeys]]方法相对应的代码如果是的话,我可以说,内部插槽是 JS 引擎中的内部变量,它将满足 ECMA 中定义的内部插槽应该做什么的目的?内部方法也一样?
2021-04-22 00:21:03
@Number945 一个特定的实现可能有一个与该插槽相对应的实际方法,或者它可能只是表现得好像它一样例如,引擎的两个不同部分可能具有针对不同假设优化的 [[OwnPropertyKeys]]“方法”的不同实现,但都保证产生规范中描述的行为
2021-05-04 00:21:03
这是迄今为止最详细、最正确的答案。请将“答案”授予@JMM。
2021-05-10 00:21:03

它只是一种用来精确描述对象应该如何表现的技巧。

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

换句话说,它是一种编写规范的方法,允许使用命令式代码来描述行为,这种方式在形式上比仅使用冗长的“自然语言”描述行为应该更精确。

我在书中读到过这样的解释 - When a property is first added to an object, JavaScript uses an internal method called [[Put]] on the object.如果 [[Put]] 只是一个语言词,为什么作者说 [[Put]] 方法被调用?因此,是否正确地说,所有这些内部插槽和方法都以某种方式实现,无论是在 JS 引擎中还是在它们创建的对象中。
2021-04-17 00:21:03