Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 替换原型中的值:类静态getter还是类字段?_Javascript_Ecmascript 6_Es6 Class_Ecmascript Next - Fatal编程技术网

Javascript 替换原型中的值:类静态getter还是类字段?

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({

几年前,我编写了自己的“declare”实现,它模仿了Dojo(有人吗?):现在,
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(...);