Javascript 替换原型中的值:类静态getter还是类字段?
几年前,我编写了自己的“declare”实现,它模仿了Dojo(有人吗?):现在,Javascript 替换原型中的值:类静态getter还是类字段?,javascript,ecmascript-6,es6-class,ecmascript-next,Javascript,Ecmascript 6,Es6 Class,Ecmascript Next,几年前,我编写了自己的“declare”实现,它模仿了Dojo(有人吗?):现在,class使它过时了。SimpledClare的美妙之处在于我可以做到: // Basic definition of the managers store var Managers = declare( JsonRestStores, JsonRestStores.HTTPMixin, JsonRestStores.SimpleDbLayerMixin, { schema: new Schema({
class
使它过时了。SimpledClare的美妙之处在于我可以做到:
// Basic definition of the managers store
var Managers = declare( JsonRestStores, JsonRestStores.HTTPMixin, JsonRestStores.SimpleDbLayerMixin, {
schema: new Schema({
name : { type: 'string', trim: 60 },
surname: { type: 'string', searchable: true, trim: 60 },
}),
storeName: 'managers',
publicURL: '/managers/:id',
handlePut: true,
handlePost: true,
handleGet: true,
handleGetQuery: true,
handleDelete: true,
});
var managers = new Managers();
是的,它有多重继承;是的,handput
,handlePost
,等等都被放置在一个“中间人”原型中。
必须将此代码转换为ES6,我有两个选项:
(现在我们不讨论“混合”了……)
选项1:静态getter(最终将成为管理器。***):
选项2:着陆时的类字段(构建时将作为普通对象属性结束):
问题是这两种解决方案都没有原型那么有效;在原型中使用这些值可以1)默认值2)使实例能够找出父对象的值(例如manager.constructor.prototype)。3) 实例更改这些值的能力(这有时很有用)
如果我使用static get
,我会得到一些非常详细的内容,其好处是实例可以计算出父对象的值,而父对象的父对象的值是;而且,除非我为每个值创建setter,否则我也不能修改这些值
如果我使用类字段(它们甚至还不存在),我会得到更好的语法,主要缺点是实例无法确定早期的默认值是什么(因为所有值都在实例中)
您会怎么做?选项1会在每次访问属性时创建新的
架构
实例,这是不允许的开销,除非这是可取的行为
选项2为每个Managers
实例创建新的Schema
实例。如果Managers
被子类化,并且schema
被覆盖,schema
将以任何方式实例化,这会带来开销
如果所有管理器
实例都应该共享相同的模式
实例,则应将其分配给类原型:
Managers.prototype.schema = new Schema(...);
还可以将其定义为静态属性,并可以选择使用getter将其加倍,以便更容易地访问类实例
在ES.next中:
class Managers extends JsonRestStores {
static schema = new Schema(...);
get schema() {
return this.constructor.schema;
}
...
}
在ES6中:
class Managers extends JsonRestStores {
get schema() {
return this.constructor.schema;
}
...
}
Managers.schema = new Schema(...);
您应该使用类构造函数作为选项2的替代方案,您的属性最终仍将作为普通对象属性,但这适用于当前的es6类实现。类语法有缺陷,处理多重继承将是一场噩梦。Eric Elliot的和在这个主题上非常有趣。你的意思是,在构造函数中一个接一个地分配属性?re:多重继承,我使用Polymer的模式来进行混合,虽然是的,有多重继承更好:D“这现在被
类
淘汰了”-我不明白为什么。你的语法显然更合适。它确实有效。那就留着吧!是什么让您认为您“必须将此代码转换为ES6”类管理器扩展了JsonRestStores{static schema=new schema(…)
不是有效的Javascript——我希望它是wereBoth,类字段是第2阶段的建议。您在问题中使用了schema=…
类字段,然后在其上添加ecmascript下一个
标记。如果您不使用Babel传输代码,而是依赖于本机实现,则类字段不适用,但不清楚为什么要将其作为目标那么,问题中的ng ES.next特性。ES6相当于静态类字段是Managers.schema=new schema(…)
。
class Managers extends JsonRestStores {
static schema = new Schema(...);
get schema() {
return this.constructor.schema;
}
...
}
class Managers extends JsonRestStores {
get schema() {
return this.constructor.schema;
}
...
}
Managers.schema = new Schema(...);