7.3 Operations on Objects

7.3.1 Get(O,P)

这个抽象操作是用来获取对象上定义的属性得值的。其中O为对象,P为属性键值,其操作步骤如下:

  • 断言: Type(O) 是 Object.
  • 断言: IsPropertyKey(P) 为true true.
  • 返回 ? O.[Get].

7.3.2 GetV(V, P)

这个抽象操作是用来获取ECMAScript语言类型值上的属性值的,如果V不是对象,则当做包装对象处理,其操作步骤如下:

  • 断言: IsPropertyKey(P) 为 true.
  • 使 O 为 ToObject(V).
  • 返回 ? O.[Get].

7.3.3 Set (O, P, V, Throw)

这个抽象操作是用来给O对象的P属性设置V值的,Throw为Boolean值:

  • 断言: Type(O) 是 Object.
  • 断言: IsPropertyKey(P) 是 true.
  • 断言: Type(Throw) 是 Boolean.
  • 使 success 为 ? O.[Set].
  • 如果 success 是 false 并且 Throw 是 true, 抛出 TypeError 异常.
  • 返回 success.

7.3.4 CreateDataProperty (O, P, V)

这个抽象操作是用来给O创建名为P,值为V的新属性,其操作步骤如下:

  • 断言: Type(O) 是 Object.
  • 断言: IsPropertyKey(P) 是 true.
  • 使 newDesc 为 属性描述符{[[Value]]: V, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}.
  • 返回 O.[DefineOwnProperty].

注意:这个抽象操作创建的属性的特性是和赋值操作时默认的特性值是一样的。正常情况下,这个属性是不存在的,如果存在并且是不可配置或者不可扩展的,[[DefineOwnProperty]] 会返回false

7.3.5 CreateMethodProperty (O, P, V)

这个抽象操作是用来给O创建名为P,值为V的新属性,其操作步骤如下:

  • 断言: Type(O) 是 Object.
  • 断言: IsPropertyKey(P) 是 true.
  • 使 newDesc 为属性描述符{[[Value]]: V, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}.
  • 返回 O.[DefineOwnProperty].

注意:这个抽象操作创建的属性的特性是和内置函数以及用class语法声明时默认的特性值是一样的。正常情况下,这个属性是不存在的,如果存在并且是不可配置或者不可扩展的,[[DefineOwnProperty]] 会返回false

7.3.6 CreateDataPropertyOrThrow (O, P, V)

这个抽象操作是用来给O创建名为P,值为V的新属性,如果不能执行失败会抛出TypeError异常,其操作步骤如下:

  • 断言: Type(O) 是 Object.
  • 断言: IsPropertyKey(P) 是 true.
  • 使 success 为 CreateDataProperty(O,p,V)
  • 如果 success 为 false,抛出 TypeError 异常
  • 返回 success

注意:这个抽象操作创建的属性的特性是和赋值操作时默认的特性值是一样的。正常情况下,这个属性是不存在的,如果存在并且是不可配置或者不可扩展的,[[DefineOwnProperty]] 会返回false从而导致抛出异常

7.3.7 DefinePropertyOrThrow (O, P, desc)

这个抽象操作是调用 [[DefineOwnProperty]] 为O创建名为P,值为V的新属性,如果不能执行失败会抛出TypeError异常,其操作步骤如下:

  • 断言: Type(O) 是 Object.
  • 断言: IsPropertyKey(P) 是 true.
  • 使 success 为 O.[DefineOwnProperty].
  • 如果 success 为 false,抛出 TypeError 异常
  • 返回 success

7.3.8 DeletePropertyOrThrow (O, P)

这个抽象操作是用来移除O上的P属性的,如果P为不可配置,那么会抛出异常,其操作过程如下:

  • 断言: Type(O) 是 Object.
  • 断言: IsPropertyKey(P) 是 true.
  • 使 success 为 O.[Delete].
  • 如果 success 为 false,抛出 TypeError 异常
  • 返回 success

7.3.9 GetMethod (V, P)

这个抽象操作是用来获取V上名为P的方法的,其操作过程如下:

  • 断言: IsPropertyKey(P) 为 true.
  • 使 func 为 GetV(V, P).
  • 如果 func 使 undefined 或 null, 返回 undefined.
  • 如果 IsCallable(func) 为 false, 抛出 TypeError 异常.
  • 返回 func.

7.3.10 HasProperty (O, P)

这个抽象操作是用来探测O上是否有P属性,P可以是自身属性也能是继承属性,其操作过程如下:

  • 断言: Type(O) 是 Object.
  • 断言: IsPropertyKey(P) 是 true.
  • 返回 ? O.[HasProperty].

7.3.11 HasOwnProperty (O, P)

这个抽象操作是用来探测O上是否有自身属性P,其操作过程如下:

  • 断言: Type(O) 是 Object.
  • 断言: IsPropertyKey(P) 是 true.
  • 使 desc 为 O.[GetOwnProperty].
  • 如果 desc 是 undefined, 返回 false.
  • 返回 true.

7.3.12 Call (F, V [ , argumentsList ])

这个抽象操作是用来调用函数对象的内部属性[[Call]],argumentList是可选参数,V为this值,F为函数对象,其操作过程如下:

  • 如果 argumentsList 没有传递, 使 argumentsList 为一个空的 List.
  • 如果 IsCallable(F) 是 false, 抛出 TypeError 异常.
  • 返回 F.[Call].

7.3.13 Construct (F [ , argumentsList [ , newTarget ]])

这个抽象操作是用来调用函数对象F的内部属性[[Construct]],argumentList、newTarget是可选参数,其操作过程如下:

  • 如果 newTarget 没传, 使 newTarget 为 F.
  • 如果 argumentsList 没传, 使 argumentsList 为一个空的 List.
  • 断言: IsConstructor(F) 为 true.
  • 断言: IsConstructor(newTarget) 为 true.
  • 返回 F.[Construct].

注意:如果newTarget没传,那么这个操作相当于 new F(…argumentsList)

7.3.14 SetIntegrityLevel (O, level)

这个抽象操作是用来修复对象的自身属性的,其操作过程如下:

  • 断言: Type(O) 是 Object.
  • 断言: level 是 either “sealed” 或者 “frozen”.
  • 使 status 为 O.[PreventExtensions].
  • 如果 status 是 false, 返回 false.
  • 使 keys 为 O.[OwnPropertyKeys].
  • 如果 level 是 “sealed”, 那么:
    • 把keys中的每个元素k重复下面的步骤,
      • 执行 DefinePropertyOrThrow(O, k, PropertyDescriptor{[[Configurable]]: false}).
  • 否则如果 level 是 “frozen”,
    • 把keys中的每个元素k重复下面的步骤,
      • 使 currentDesc 为 O.[GetOwnProperty].
      • 如果 currentDesc 不是 undefined, 那么:
        • 如果 IsAccessorDescriptor(currentDesc) 是 true, 那么:
          • 使 desc 为 PropertyDescriptor{[[Configurable]]: false}.
        • 否则,
          • 使 desc 为 PropertyDescriptor { [[Configurable]]: false, [[Writable]]: false }.
        • 执行 DefinePropertyOrThrow(O, k, desc).
    • 返回 true.

7.3.15 TestIntegrityLevel (O, level)

这个抽象操作是用来探测对象是否已经被修复了,其操作过程如下:

  • 断言: Type(O) 是 Object.
  • 断言: level 是 “sealed” 或者 “frozen”.
  • 使 status 为 IsExtensible(O).
  • 如果 status 是 true, 返回 false.
  • 注意如果这个对象是可扩展的, 那它的属性都是未检测的.
  • 使 keys 为 O.[OwnPropertyKeys].
  • k为keys的元素,使其重复下面的步骤,
    • 使 currentDesc 为 O.[GetOwnProperty].
    • 如果 currentDesc 不是 undefined, 那么
      • 如果 currentDesc.[[Configurable]] 是 true, 返回 false.
      • 如果 level 是 “frozen” 并且 IsDataDescriptor(currentDesc) 是 true, 那么
        • 如果 currentDesc.[[Writable]] 是 true, 返回 false.
  • 返回 true.

7.3.16 CreateArrayFromList (elements)

这个抽象操作是用来把List中的元素创建成一个Array:

  • 断言: elements 是一个List.
  • 使 array 为 ArrayCreate(0).
  • 使 n 为 0.
  • e为elements中的元素,重复下面的步骤
    • 使 status 为 CreateDataProperty(array, ! ToString(n), e).
    • 断言: status 是 true.
    • n 加1.
  • 返回 array.

7.3.17 CreateListFromArrayLike (obj [ , elementTypes ] )

这个抽象操作是用来从一个类数组的对象中创建List,可选参数elementTypes是List元素的类型:

  • 如果 elementTypes 没传, 使 elementTypes 为 « Undefined, Null, Boolean, String, Symbol, Number, Object ».
  • 如果 Type(obj) 不是 Object, 抛出 TypeError 异常.
  • 使 len 为 ToLength(? Get(obj, “length”)).
  • 使 list 为 新的空的 List.
  • 使 index 为 0.
  • 当 index < len,重复下面的步骤
    • 使 indexName 为 ! ToString(index).
    • 使 next 为 Get(obj, indexName).
    • 如果 Type(next) 不是 elementTypes中的一种, 抛出 TypeError 异常.
    • 把next作为加入到list中,作为最后一个元素.
    • index 加1.
  • 返回 list.

7.3.18 Invoke (V, P [ , argumentsList ])

这个抽象操作是用来调用对象上的函数属性,V既是这个属性查找的起点,也是this值,argumentList是可选参数:

  • 断言: IsPropertyKey(P) 是 true.
  • 如果 argumentsList 没传, 使 argumentsList 为一个新的空的 List.
  • 使 func 为 GetV(V, P).
  • 返回 Call(func, V, argumentsList).

7.3.19 OrdinaryHasInstance (C, O)

这个抽象操作是用来探测对象O是否是从构造函数C的继承路径上继承来的:

  • 如果 IsCallable(C) 是 false, 返回 false.
  • 如果 C 有 [[BoundTargetFunction]] 这个属性, then
    • 使 BC 为 C’s [[BoundTargetFunction]] 的值.
    • 返回 InstanceofOperator(O, BC).
  • 如果 Type(O) 不是 Object, 返回 false.
  • 使 P 为 Get(C, “prototype”).
  • 如果 Type(P) 不是 Object, 抛出 TypeError 异常.
  • 重复下面的步骤
    • 使 O 为 O.[GetPrototypeOf].
    • 如果 O 是 null, 返回 false.
    • 如果 SameValue(P, O) 是 true, 返回 true.

7.3.20 SpeciesConstructor ( O, defaultConstructor )

这个抽象操作是用来获取创建O的构造函数,如果构造函数没找到,则返回defaultConstructor:

  • 断言: Type(O) 是 Object.
  • 使 C 为 Get(O, “constructor”).
  • 如果 C 是 undefined, 返回 defaultConstructor.
  • 如果 Type(C) 不是 Object, 抛出 TypeError 异常.
  • 使 S 为 Get(C, @@species).
  • 如果 S 是 undefined 或者 null, 返回 defaultConstructor.
  • 如果 IsConstructor(S) 是 true, 返回 S.
  • 抛出TypeError异常.

7.3.21 EnumerableOwnNames (O)

这个抽象操作是在O上调用EnumerableOwnNames,其操作过程如下:

  • 断言: Type(O) 是 Object.
  • 使 ownKeys 为 O.[OwnPropertyKeys].
  • 使 names 为 一个新的空的 List.
  • key为ownKeys的元素,重复下面的步骤
    • 如果 Type(key) 是 String, 那么
      • 使 desc 为 O.[GetOwnProperty].
      • 如果 desc 不是 undefined, 那么
        • 如果 desc.[[Enumerable]] 是 true, 把key加入names
  • 把names中的顺序和调用EnumerateObjectProperties返回的顺序一样.
  • 返回 names.

7.3.22 GetFunctionRealm ( obj )

这个抽象操作过程如下:

  • 断言: obj 是一个可调用对象.
  • 如果 obj 有 [[Realm]] 内部属性, 那么
    • 返回 obj’s [[Realm]].
  • 如果 obj 是Bound Function exotic object, 那么
    • 使 target 为 obj’s [[BoundTargetFunction]] 内部属性.
    • 返回 GetFunctionRealm(target).
  • 如果 obj 是 Proxy exotic object, 那么
    • 如果 obj的[[ProxyHandler]] 内部属性的值是 null, 抛出 TypeError 异常.
    • 使 proxyTarget 为 obj’s [[ProxyTarget]] 内部属性.
    • 返回 GetFunctionRealm(proxyTarget).
  • 返回 the current Realm Record(8.3).

注意:第五步只有在obj不是一个标准的exotic function object时,其没有[[Realm]] 内部属性才会执行.