我觉得我记得在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)。
  


总结起来,它们是可配置的,可写的和不可枚举的。

08-08 02:49