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 事件的所有子类存储的所有数据。

如果我的 setter/getterbase.js不是static,我遇到的问题是a.js只会跟踪a.js's 的数据而不知道b.js's 的数据。

如果这确实是静态 getter/setter 访问器的无效用例,我可能不得不将数据存储功能拆分为一个单独的单例,该单例跟踪数据并且是所有子类的依赖项。不是世界末日,但由于这个“有效”,我想更多地了解静态 getter 和 setter 的用例。

谢谢参观。


更新:这是作为 JS Fiddle 的示例,它还演示了(在简化的测试用例中它应该如何工作:

问题是:不管单例/pubsub 存储是否更好,staticFilters超类中使用 是否有效?特别是该static set data (newData) {}方法,因为它实际上可以访问this._data,并且我被告知对于任何方法,static我都不能访问该立即函数之外的任何内容,并且由于this._data不作为参数传递给该方法,因此我不应该static在此处使用。

4

1 回答 1

1

“非工作”示例未使用static

是的,不使用static您的属性将分别在每个实例上设置,因此它们不会被任何东西共享。

有人告诉我,对于任何方法,static我都不能访问该立即函数之外的任何内容,并且由于this._data不作为参数传递给该方法,因此我不应该static在此处使用。

谁告诉你这可能是指实例属性。如果从实例方法调用静态方法,当然不能访问实例的属性this,这就是静态方法的全部意义所在。
但是,就像在其他所有方法调用中一样,您可以访问被调用对象的属性,对于静态方法来说,就是类(构造函数)本身。Usingthis._data确实可以访问静态 Base._data属性 - 这就是您在用例中想要的,所以使用它完全没问题。

于 2016-09-02T02:39:33.810 回答