在ES6类中的静态setter中访问类数据

时间:2016-09-01 21:52:50

标签: javascript class static ecmascript-6 es6-class

我正在尝试实现以下目的:将子类中的数据存储在超类中。

以下示例在实践中确实有效但我被告知在下面的示例中使用static get|set x() {}是不正确的,因为setter方法使用的this._data不在立即函数的上下文,即不作为参数传递给函数,因此setter不再是静态的。

示例:

'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中的setter / getter不是static,我遇到的问题是a.js只会跟踪a.js的数据而不知道b.js的数据。

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

谢谢你看看。

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

问题是:无论单例/ pubsub存储是否更好,static超类中Filters的使用是否有效?特别是static set data (newData) {}方法,因为它实际访问this._data,并且我被告知任何方法都是static我不能访问该直接函数之外的任何内容,因为this._data是没有作为参数传递给方法我不应该在这里使用static

1 个答案:

答案 0 :(得分:1)

  

"不工作"示例不使用static

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

  

我被告知,对于任何方法都是static我不能访问那个直接函数之外的任何东西,因为this._data没有作为参数传递给方法,所以我不应该使用{{1这里。

告诉你的人可能会提到实例属性。如果从实例方法调用静态方法,则无法使用static来访问实例的属性,这是静态方法的全部要点。
但是,像在每个其他方法调用中一样,您可以访问被调用对象的属性,对于静态方法,它是类(构造函数)本身。使用this可以访问静态 this._data属性 - 这就是您在用例中所需的内容,因此使用它完全没问题。