Синтаксис Определения Методов
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] }
FormalParameter [~Yield, ~Await]
Статическая семантика: Ранние Ошибки — Early Errors
MethodDefinition : ClassElementName ( UniqueFormalParameters ) { FunctionBody }
- Это синтаксическая ошибка, если для FunctionBodyContainsUseStrict для FunctionBody установлено значение true, а для IsSimpleParameterList для UniqueFormalParameters — значение false.
- Это синтаксическая ошибка, если какой-либо элемент BoundNames из UniqueFormalParameters также встречается в LexicallyDeclaredNames объекта FunctionBody.
MethodDefinition : set ClassElementName ( PropertySetParameterList ) { FunctionBody }
- Это синтаксическая ошибка, если BoundNames из PropertySetParameterList содержит какие-либо повторяющиеся элементы.
- Синтаксическая ошибка возникает, если для FunctionBodyContainsUseStrict для FunctionBody установлено значение true, а для IsSimpleParameterList для PropertySetParameterList — значение false.
- Это синтаксическая ошибка, если какой-либо элемент BoundNames из PropertySetParameterList также встречается в LexicallyDeclaredNames из 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.
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