1

私は次のことを達成しようとしています: サブクラスからのデータをスーパークラスに格納します。

static get|set x() {}次の例は実際には機能しますが、以下の例での の使用は正しくないと言われました。これは、setterメソッドthis._dataが即時関数のコンテキスト外である (つまり、関数に引数として渡されていない) を使用しているためです。そのようなセッターはもはや静的ではありません。

例:

'use strict';

// base.js
class Base {
    constructor () {}

    static get data () {
        return this._data;
    }

    static set data (newData) {
        // merge newData into existing data
        return this._data = _.assign({}, this._data, newData);
    }
}

//------------------------------------------------------------------------------

// a.js
class A extends Base {
    constructor () {
        super();
    }

    add (obj) {
        Base.data = obj;
    }
}
let a = new A();
a.add({b: 'test'});
// -> Expectation: Base.data = { b: 'test' } now

//------------------------------------------------------------------------------

// b.js
class B extends Base {
    constructor () {
        super();
    }

    add (str) {
        Base.data = {
            someFixedKey: str
        };
    }
}
let b = new B();
b.add('hello');
// -> Expectation: Base.data = { b: 'test', someFixedKey: 'hello' } now

ここで達成しようとしているのは、他の複数のサブクラスのベースにある単一のスーパークラスを持つことです。これらのサブクラスは、データが変更されるたびに PubSub 通知を行い、完全なデータ オブジェクトを送信できるスーパークラスにデータを格納できます。その PubSub イベントですべてのサブクラスによって保存されたすべてのデータを含みます。

私のセッター/ゲッターbase.jsがそうでないstatic場合、私が抱えていた問題は、のデータa.jsのみを追跡しa.js、のデータについては知らないということb.jsです。

これが実際に静的 getter/setter アクセサーの無効な使用例である場合、データ ストア機能を、データを追跡し、すべてのサブクラスの依存関係となる別のシングルトンに分割する必要があるかもしれません。世界の終わりではありませんが、これは「うまくいく」ので、静的ゲッターとセッターの使用例についてもっと知りたいです。

ご覧いただきありがとうございます。


更新:これは JS Fiddle としての例です (縮小されたテスト ケースでは、どのように機能するかを示します:

問題は、シングルトン/パブサブ ストアが優れているかどうかに関係なくstatic、スーパークラス内での使用はFilters有効ですか? 特にstatic set data (newData) {}メソッドは実際にアクセスするため、どのメソッドでもその即時関数の外部にアクセスしてはならないthis._dataと言われているため、ここでは使用しない引数としてメソッドに渡されません。staticthis._datastatic

4

1 に答える 1