我正在尝试实现以下目的:将子类中的数据存储在超类中。
以下示例在实践中确实有效但我被告知在下面的示例中使用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的示例,该示例还演示了(在简化的测试用例中 应该如何工作:
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
。
答案 0 :(得分:1)
"不工作"示例不使用
static
是的,如果不使用static
,您的属性将分别在每个实例上设置,因此它们不会被任何内容共享。
我被告知,对于任何方法都是
static
我不能访问那个直接函数之外的任何东西,因为this._data
没有作为参数传递给方法,所以我不应该使用{{1这里。
告诉你的人可能会提到实例属性。如果从实例方法调用静态方法,则无法使用static
来访问实例的属性,这是静态方法的全部要点。
但是,像在每个其他方法调用中一样,您可以访问被调用对象的属性,对于静态方法,它是类(构造函数)本身。使用this
可以访问静态 this._data
属性 - 这就是您在用例中所需的内容,因此使用它完全没问题。