2017-05-20 18 views
6

スタティック(またはクラス)プロパティをES6クラスに設定し、そのクラスの新しいインスタンスを作成した後に変更する別の方法を見つけようとしています。ES6クラス - 静的プロパティを更新する

たとえば、私はGeoというクラスがあり、Geoクラスのすべてのインスタンスの配列を与える 'all'という静的プロパティが必要です。

このバージョンでは動作します:

class Geo { 
    constructor(name){ 
    this.name = name; 
    Geo.all.push(this); 
    } 
} 

Geo.all = []; 

ruby = new Geo("Ruby"); 
rocks = new Geo("Rocks"); 
console.log(Geo.all.length); // => 2 

私も、クラス定義のプロパティOUTSIDEを設定していないことを好むだろう。私はいくつか試してみましたが、コンストラクタから更新できるクラス内に静的プロパティを作成できないようです。

私はまた、Babelなどを使用せずにブラウザ(Chrome)でこれを行う必要があることを言及する必要があります。ここで

は、私が試したいくつかの例です:

class Geo { 
    constructor(name){ 
    this.name = name; 
    Geo.all.push(this); 
    } 
    static get all() { 
    return []; 
    } 
} 

ruby = new Geo("Ruby"); 
rocks = new Geo("Rocks"); 
console.log(Geo.all.length); // => 0 

、別の

class Geo { 
    constructor(name){ 
    this.name = name; 
    Geo.all.push(this); 
    } 

    static all = []; 
} 

ruby = new Geo("Ruby"); 
rocks = new Geo("Rocks"); 
console.log(Geo.all.length); // => error unexpected "=" 

任意の助けいただければ幸いです。

+1

これを行う方法は他にありません。 – Bergi

+2

'Geo.all = []'の何が問題なのですか? – dfsq

+3

グローバルなインスタンスのコレクションを持たないでください。メモリリークやモジュール化(テスト可能性など)の問題が発生します – Bergi

答えて

6

ES6にstatic all = []というようなものはありません。 Class fields are stage 2 proposalであり、これは、蒸留器を介して使用することができる。バベル

Geo.all = []; 

は、これをES6で実行するのに有効であり、好ましい方法です。静的プロパティで

class Geo { 
    static get all() { 
    if (!this._all) 
     this._all = []; 

    return this._all; 
    } 

    constructor() { ... } 
} 

追跡インスタンスは、一般的に良好なパターンと見なすことができず、制御不能なメモリ消費と漏れにつながる(AS:または読み取り専用プロパティの唯一のゲッター - 代替案は、ゲッター/セッター対ですコメントに記載されています)。

+3

2017年12月現在、これは現在ステージ3の提案です:https://github.com/tc39/proposal-class-fields#field-declarations –

関連する問題