我觉得我记得在es-discuss上看到某事说es6类方法不可写,例如
class Foo{
method(){}
}
Object.getOwnPropertyDescriptor(Foo.prototype, "method").writable -> false
我在Microsoft Edge和Traceur中都尝试过,它们都是可写的,我也无法一生都想出如何在规范中找到它。
那他们可写吗?还是课程规范还没有完全流行起来?
最佳答案
是的,它们是可写的。
根据14.5.14 Runtime Semantics: ClassDefinitionEvaluation,
如果不存在ClassBodyopt,则将方法设为新的空List。
否则,让方法成为ClassBody的NonConstructorMethodDefinitions。
对于每个ClassElement m,按从方法开始的顺序
如果m的IsStatic为假,则
令status为对proto和false参数执行m的PropertyDefinitionEvaluation的结果。
其他,
令status为使用参数F和false对m执行PropertyDefinitionEvaluation的结果。
在14.3.9 Runtime Semantics: PropertyDefinitionEvaluation中定义了PropertyDefinitionEvaluation:
方法定义:PropertyName (
StrictFormalParameters )
{
FunctionBody }
令methodDef为带有参数对象的MethodDefinition的DefineMethod。
ReturnIfAbrupt(methodDef)。
执行SetFunctionName(methodDef。[[closure]],methodDef。[[key]])。
令desc为Property Descriptor {[[Value]]:methodDef。[[closure]],[[Writable]]:true,[[Enumerable]]:可枚举,
[[可配置]]:是。
返回DefinePropertyOrThrow(对象,methodDef。[[key]],desc)。
总结起来,它们是可配置的,可写的和不可枚举的。