【发布时间】:2016-01-11 05:26:18
【问题描述】:
试用 ES6 并尝试创建一个具有静态属性和解析函数的类。然后我想为我正在解析的每种不同类型扩展基本解析器。不确定我是否正在执行反模式,但我无法覆盖静态属性。
这是我的基础解析器
class Module {
static name = 'Default Module'
static version = {major:10000, minor: 10000}
static checkVersion({majorVersion = 10000, minorVersion = 10000}) {
if(this.version.major !== majorVersion || this.version.minor > minorVersion) {
throw `${this.name} requires version ${this.version.major}.${this.version.minor} got ${majorVersion}.${minorVersion}`;
}
}
static parse(data) {
try {
this.checkVersion(data);
return this.internalParser(data);
} catch (e) {
throw e;
}
}
static internalParser(data) {
throw `${this.name} has no parser implemented`;
}
}
然后我想像这样扩展
class ExtendedModule extends Module {
static name = 'Extended';
static version = {major: 1, minor:0}
static internalParser(data) {
//Some stuff
}
}
但是在使用 babel 编译节点时,我得到了
true; if ('value' in descriptor) descriptor.writable = true; Object.defineProp
^
TypeError: Cannot redefine property: name
at Function.defineProperty (native)
有人知道这是可能的还是完全错误的?
【问题讨论】:
-
这不是 ES6。 ES6 没有类属性初始化器。
-
另外,
Module.name是"Module"(它仍然是一个命名的构造函数)。你不能在上面放另一个.name。 -
@Bergi 虽然它可能会导致框架或类似问题,例如为了创建一些调试输出而尝试读取名称,您绝对可以在其上添加另一个
.name。这对 Javascript 来说很棒:您可以轻松地破坏事物,但您仍然可以做到。 ;) -
@cepharum 我的评论是针对该属性的不可写性,而不是是否应该重命名。
-
@Bergi 你的评论是关于developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 在TOs 类
Module的上下文中。这个属性不是可写的,没错,但是是可配置的。因此,仍然可以“在其上放置另一个.name”。
标签: javascript class static ecmascript-6 extends