9.2 ECMAScript 函数对象
9.2.2 [[Construct]] ( argumentsList, newTarget )
[[Construct]]是ECMAScript 函数对象的内置方法,它可以以 argumentsList和newTarget为参数进行调用。argumentsList可能为一个空的List。其执行过程如下:
- 断言F是个函数对象
- 断言newTarget是个对象类型
- callerContext为当前执行环境上下文
- kind为F.[[ConstructorKind]]
- 如果kind的值为'base',那么:
- thisArgument 为 OrdinaryCreateFromConstructor(newTarget, "%ObjectPrototype%")的执行结果.
- calleeContext 为 PrepareForOrdinaryCall(F, newTarget)的执行结果
- 断言calleeContext 是当前执行上下文.
- 如果kind是"base", 执行 OrdinaryCallBindThis(F, calleeContext, thisArgument).
- 使 constructorEnv 为 calleeContext 的 LexicalEnvironment
- 使 envRec 为 constructorEnv 的 EnvironmentRecord.
- 使 result 为 OrdinaryCallEvaluateBody(F, argumentsList)的执行结果
- 把 calleeContext 这个上下文从上下文堆栈中移除,从而使callerContext恢复为当前的执行上下文
- 如果 result.[[Type]] 为 return, 那么
- 如果 Type(result.[[Value]]) 是对象, 那么返回 NormalCompletion(result.[[Value]]).
- 如果 kind 是 "base", 返回 NormalCompletion(thisArgument).
- 如果 result.[[Value]] 不是 undefined, 抛出异常
- 否则, ReturnIfAbrupt(result).
- 返回 envRec.GetThisBinding().