ECMAScript | Определения Методов (Method Definitions)

ECMAScript | Определения Методов (Method Definitions)

Синтаксис Определения Методов

MethodDefinition [Yield, Await] :

ClassElementName [?Yield, ?Await] ( UniqueFormalParameters [~Yield, ~Await] ) { FunctionBody [~Yield, ~Await] }

GeneratorMethod [?Yield, ?Await]

AsyncMethod [?Yield, ?Await]

AsyncGeneratorMethod [?Yield, ?Await]

get ClassElementName [?Yield, ?Await] ( ) { FunctionBody [~Yield, ~Await] }

set ClassElementName [?Yield, ?Await] ( PropertySetParameterList ) { FunctionBody [~Yield, ~Await] }

PropertySetParameterList :

FormalParameter [~Yield, ~Await]

 

Статическая семантика: Ранние Ошибки — Early Errors

MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }

MethodDefinition : set ClassElementName ( PropertySetParameterList ) { FunctionBody }

 

Статическая семантика: Имеет Директиву Super — HasDirectSuper

MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }

1. Если Уникальные Формальные Параметры UniqueFormalParameters Содержат SuperCall является true (истинно), вернуть true (истину).
2. Вернуть FunctionBody Содержащий SuperCall.

MethodDefinition : get ClassElementName ( ) { FunctionBody }

1. Вернуть FunctionBody Содержащий SuperCall.

MethodDefinition : set ClassElementName ( PropertySetParameterList ) { FunctionBody }

1. Если PropertySetParameterList Содержит SuperCall имеет значение true (истина), вернуть true (истину).
2. Вернуть FunctionBody Содержащий SuperCall.

GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody }

1. Если Уникальные Формальные Параметры UniqueFormalParameters Содержат SuperCall является true (истинно), вернуть true (истину).
2. Вернуть GeneratorBody Содержащий SuperCall.

AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }

1. Если Уникальные Формальные Параметры UniqueFormalParameters Содержат SuperCall является true (истинно), вернуть true (истину).
2. Вернуть тело асинхронного генератора AsyncGeneratorBody, Содержащее SuperCall.

AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }

1. Если Уникальные Формальные Параметры UniqueFormalParameters Содержат SuperCall является true (истинно), вернуть true (истину).
2. Вернуть тело асинхронной функции AsyncFunctionBody, которое содержит SuperCall.

 

Статическая семантика: Специальный Метод — SpecialMethod

MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }

1. Вернуть false.

MethodDefinition :

GeneratorMethod

AsyncMethod

AsyncGeneratorMethod

get ClassElementName ( ) { FunctionBody }

set ClassElementName ( PropertySetParameterList ) { FunctionBody }

1. Вернуть true.

 

Семантика времени выполнения: Определить метод — DefineMethod

С параметром object и необязательным параметром functionPrototype.

MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }

1. Пусть propKey будет результатом вычисления ClassElementName.
2. ReturnIfAbrupt(propKey).
3. Пусть область действия scope будет LexicalEnvironment текущего контекста выполнения.
4. Пусть privateScope будет PrivateEnvironment текущего контекста выполнения.
5. Если присутствует functionPrototype, то
   а. Пусть прототип prototype будет functionPrototype.
6. Иначе,
   а. Пусть прототип prototype будет %Function.prototype%.
7. Пусть sourceText будет исходным текстом, сопоставленным с MethodDefinition.
8. Пусть замыкание closure будет OrdinaryFunctionCreate(prototype, sourceText, UniqueFormalParameters, FunctionBody, non-lexical-this, scope, privateScope).
9. Выполните MakeMethod(closure, object).
10. Вернуть запись Record {[[Key]]: propKey, [[Closure]]: closure}.

 

Семантика времени выполнения: Оценка определения метода — MethodDefinitionEvaluation

С параметрами object и enumerable.

MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }

1. Пусть methodDef будет ? DefineMethod из MethodDefinition с аргументом object.
2. Вернуть ? DefineMethodProperty(methodDef.[[Key]], object, methodDef.[[Closure]], enumerable).

MethodDefinition : get ClassElementName ( ) { FunctionBody }

1. Пусть propKey будет результатом вычисления ClassElementName.
2. ReturnIfAbrupt(propKey).
3. Пусть область действия scope будет LexicalEnvironment текущего контекста выполнения.
4. Пусть privateScope будет PrivateEnvironment текущего контекста выполнения.
5. Пусть sourceText будет исходным текстом, сопоставленным с MethodDefinition.
6. Пусть formalParameterList будет экземпляром производства FormalParameters : [empty].
7. Пусть замыкание closure будет OrdinaryFunctionCreate(%Function.prototype%, sourceText, formalParameterList, FunctionBody, non-lexical-this, scope, privateScope).
8. Выполните MakeMethod(closure, object).
9. Выполните SetFunctionName(closure, propKey, "get").
10. Если propKey является частным именем Private Name, тогда
   а. Вернуть частный элемент PrivateElement {[[Key]]: propKey, [[Kind]]: accessor, [[Get]]: closure, [[Set]]: undefined} ".
11. Иначе,
   а. Пусть desc будет PropertyDescriptor {[[Get]]: closure, [[Enumerable]]: enumerable, [[Configurable]]: true} ".
   b. Выполнить ? DefinePropertyOrThrow(object, propKey, desc).
   c. Вернуть empty.

MethodDefinition : set ClassElementName ( PropertySetParameterList ) { FunctionBody }

1. Пусть propKey будет результатом вычисления ClassElementName.
2. ReturnIfAbrupt(propKey).
3. Пусть область действия scope будет LexicalEnvironment текущего контекста выполнения.
4. Пусть privateScope будет PrivateEnvironment текущего контекста выполнения.
5. Пусть sourceText будет исходным текстом, сопоставленным с MethodDefinition.
6. Пусть замыкание closure будет OrdinaryFunctionCreate(%Function.prototype%, sourceText, PropertySetParameterList, FunctionBody, non-lexical-this, scope, privateScope).
7. Выполните MakeMethod(closure, object).
8. Выполните SetFunctionName(closure, propKey, "set").
9. Если propKey является частным именем Private Name, тогда
   а. Вернуть частный элемент PrivateElement {[[Key]]: propKey, [[Kind]]: accessor, [[Get]]: undefined, [[Set]]: closure} ".
10. Иначе,
   а. Пусть desc будет PropertyDescriptor {[[Set]]: closure, [[Enumerable]]: enumerable, [[Configurable]]: true} ".
   b. Выполнить ? DefinePropertyOrThrow(object, propKey, desc).
   c. Вернуть empty.

GeneratorMethod : * ClassElementName ( UniqueFormalParameters ) { GeneratorBody }

1. Пусть propKey будет результатом вычисления ClassElementName.
2. ReturnIfAbrupt(propKey).
3. Пусть область действия scope будет LexicalEnvironment текущего контекста выполнения.
4. Пусть privateScope будет PrivateEnvironment текущего контекста выполнения.
5. Пусть sourceText будет исходным текстом, сопоставленным с GeneratorMethod.
6. Пусть замыкание closure будет OrdinaryFunctionCreate(%GeneratorFunction.prototype%, sourceText, UniqueFormalParameters, GeneratorBody, non-lexical-this, scope, privateScope).
7. Выполните MakeMethod(closure, object).
8. Выполните SetFunctionName(closure, propKey).
9. Пусть прототип prototype будет ! OrdinaryObjectCreate(%GeneratorFunction.prototype.prototype%).
10. Выполнить ! DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor {[[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false} ».
11. Вернуть ? DefineMethodProperty(propKey, object, closure, enumerable).

AsyncGeneratorMethod : async * ClassElementName ( UniqueFormalParameters ) { AsyncGeneratorBody }

1. Пусть propKey будет результатом вычисления ClassElementName.
2. ReturnIfAbrupt(propKey).
3. Пусть область действия scope будет LexicalEnvironment текущего контекста выполнения.
4. Пусть privateScope будет PrivateEnvironment текущего контекста выполнения.
5. Пусть sourceText будет исходным текстом, совпадающим с AsyncGeneratorMethod.
6. Пусть замыкание closure будет ! OrdinaryFunctionCreate(%AsyncGeneratorFunction.prototype%, sourceText, UniqueFormalParameters, AsyncGeneratorBody, non-lexical-this, scope, privateScope).
7. Выполнить ! MakeMethod(closure, object).
8. Выполнить ! SetFunctionName(closure, propKey).
9. Пусть прототип prototype будет ! OrdinaryObjectCreate(%AsyncGeneratorFunction.prototype.prototype%).
10. Выполнить ! DefinePropertyOrThrow(closure, "prototype", PropertyDescriptor {[[Value]]: prototype, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false} ».
11. Вернуть ? DefineMethodProperty(propKey, object, closure, enumerable).

AsyncMethod : async ClassElementName ( UniqueFormalParameters ) { AsyncFunctionBody }

1. Пусть propKey будет результатом вычисления ClassElementName.
2. ReturnIfAbrupt(propKey).
3. Пусть область действия scope будет LexicalEnvironment текущего контекста выполнения.
4. Пусть privateScope будет PrivateEnvironment текущего контекста выполнения.
5. Пусть sourceText будет исходным текстом, совпадающим с AsyncMethod.
6. Пусть замыкание closure будет ! OrdinaryFunctionCreate(%AsyncFunction.prototype%, sourceText, UniqueFormalParameters, AsyncFunctionBody, non-lexical-this, scope, privateScope).
7. Выполнить ! MakeMethod(closure, object).
8. Вернуть ? DefineMethodProperty(propKey, object, closure, enumerable).

 

 

Информационные ссылки

Стандарт ECMAScript — Раздел «15.4 Method Definitions» — https://tc39.es/ecma262/#sec-method-definitions