我正在尝试实现以下目标:将来自子类的数据存储在超类中。
以下示例在实践中确实有效,但有人告诉我,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 的示例,它还演示了(在简化的测试用例中它应该如何工作:
- “工作”示例使用
static
:https ://jsbin.com/koruba/2/edit?js,console - “非工作”示例未使用
static
:https ://jsbin.com/koruba/3/edit?js,console
问题是:不管单例/pubsub 存储是否更好,static
在Filters
超类中使用 是否有效?特别是该static set data (newData) {}
方法,因为它实际上可以访问this._data
,并且我被告知对于任何方法,static
我都不能访问该立即函数之外的任何内容,并且由于this._data
不作为参数传递给该方法,因此我不应该static
在此处使用。