6.1.7.2 Object 内在方法和插槽

在 ECMAScript 中,对象的实际语义通过称为内部方法的算法指定。 ECMAScript 引擎中的每个对象都与一组定义其运行时行为的内部方法相关联。 这些内部方法并不是 ECMAScript 语言的一部分。 它们是本规范纯粹为了说明目的而定义的。 但是,ECMAScript 实现中的每个对象必须按照与其关联的内部方法指定的行为。 实现这一点的确切方式由内置系统来确定。

内部方法名称是多态的。 这意味着,当在其上调用公共内部方法名称时,不同的对象值可以执行不同的算法。 调用内部方法的实际对象是调用的 “目标”。 如果在运行时,算法的实现尝试使用对象不支持的对象的内部方法,则抛出 TypeError 异常。

内部插槽对应于与对象关联并由各种 ECMAScript 规范算法使用的内部状态。 内部插槽不是对象属性,它们不是继承的。 根据特定的内部槽规范,这种状态可以由任何 ECMAScript 语言类型或特定 ECMAScript 规范类型值的值组成。 除非另外明确指定,否则内部槽被分配作为创建对象的过程的一部分,并且可以不动态地添加到对象。 除非另有说明,否则内部插槽的初始值为 undefined 的值。 本规范中的各种算法创建具有内部槽的对象。 然而,ECMAScript 语言没有提供将内部槽与对象相关联的直接方式。

本规范中使用双方括号 [[]] 中的名称标识内部方法和内部插槽。

图表 5 总结了本规范使用的,适用于由 ECMAScrip t代码创建或操作的所有对象的基本内部方法。 每个对象必须具有所有必要的内部方法的算法。 然而,所有对象不一定对那些方法使用相同的算法。

图表 5 的 “签名” 列和其他类似的表描述了每个内部方法的调用模式。 调用模式始终包括描述性参数名称的括号列表。 如果参数名称与 ECMAScript 类型名称相同,则名称描述参数值的所需类型。 如果内部方法显式返回一个值,其参数列表后面是符号 “→” 和返回值的类型名称。 签名中使用的类型名称指的是第 6 节中定义的类型,增加了以下附加名称。 “任何” 意味着该值可以是任何 ECMAScript 语言类型。 内部方法隐式返回完成记录。 除了其参数之外,内部方法总是可以访问作为方法调用的目标的对象。

图表5:基本内部方法

内部方法(Internal Method) 签名(Signature) 描述(Description)
[[GetPrototypeOf]] () → Object 或 Null 确定为此对象提供继承属性的对象。 空值表示没有继承属性。
[[SetPrototypeOf]] (Object 或 Null) → Boolean 将此对象与提供继承属性的另一个对象相关联。 传递 null 表示没有继承属性。 返回 true 表示操作已成功完成或 false 表示操作未成功。
[[IsExtensible]] ( ) → Boolean 确定是否允许向此对象添加其他属性。
[[PreventExtensions]] ( ) → Boolean 控制是否可以将新属性添加到此对象。如果操作成功,则返回 true;如果操作不成功,则返回 false。
[[GetOwnProperty]] (propertyKey) → Undefined 或 Property Descriptor 返回此对象的属性的属性描述符,其键为 propertyKey,如果不存在此属性,则返回 undefined。
[[DefineOwnProperty]] (propertyKey, PropertyDescriptor) → Boolean 创建或更改自己的属性(其键为 propertyKey)以具有 PropertyDescriptor 描述的状态。 如果该属性已成功创建/更新,则返回 true;如果无法创建或更新属性,则返回 false。
[[HasProperty]] (propertyKey) → Boolean 返回一个布尔值,指示此对象是否已拥有自己的或继承的属性,其键为 propertyKey
[[Get]] (propertyKey, Receiver) → any 从此对象返回键为 propertyKey 的属性的值。 如果必须执行任何 ECMAScript代码以检索属性值,则在评估代码时将使用 Receiver 作为 this 值。
[[Set]] (propertyKey, value, Receiver) → Boolean 将键为 propertyKey 的属性的值设置为 value。 如果必须执行任何 ECMAScript 代码来设置属性值,则在评估代码时将使用 Receiver 作为 this 值。 如果属性值设置为 false,则返回 true,如果无法设置,则返回 false。
[[Delete]] (propertyKey) → Boolean 从此对象中删除其键为 propertyKey 的属性。 如果属性未删除并仍存在,则返回 false。 如果属性已删除或不存在,则返回 true。
[[OwnPropertyKeys]] ()→List of propertyKey 返回一个列表,其元素是对象的所有属性键。

图表 6 总结了可被称为函数的对象支持的其他必要内部方法。 函数对象是支持 [[Call]] 内部方法的对象。 构造函数(constructor)(也称为构造函数(constructor function))是支持 [[Construct]] 内部方法的函数对象。

图表6:函数对象附加的基本内部方法

内部方法(Internal Method) 签名(Signature) 描述(Description)
[[Call]] (any, a List of any) → any 执行与此对象关联的代码。 通过函数调用表达式调用。 内部方法的参数是一个 this 值和一个包含通过调用表达式传递给函数的参数的列表。 实现这个内部方法的对象是可调用的。
[[Construct]] (a List of any, Object) → Object 创建对象。 通过新的或超级运算符调用。 内部方法的第一个参数是包含运算符的参数的列表。 第二个参数是最初应用新运算符的对象。 实现此内部方法的对象称为构造函数。 函数对象不一定是构造函数,并且这样的非构造函数对象没有 [[Construct]] 内部方法。

普通对象和标准异常对象的基本内部方法的语义在第 9 节中规定。如果实现不支持异常对象的内部方法的任何指定使用,则该用法在尝试时必须引发 TypeError 错误提示。

results matching ""

    No results matching ""