我试图实现以下目标:将子类的数据存储在父类(super 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
我在这里想要实现的是拥有一个位于多个其他子类基础上的父类(super class),并且这些子类可以将它们的数据存储在父类(super class)中,然后每当数据发生变化时父类(super class)就会发出 PubSub 通知,并且能够发送包含所有子类通过该 PubSub 事件存储的所有数据的完整数据对象。
如果我的 base.js
中的 setter/getter 不是 static
,我遇到的问题是 a.js
只会跟踪 a.js
的数据,但不了解 b.js
的数据。
如果这确实是静态 getter/setter 访问器的无效用例,我可能必须将数据存储功能拆分为一个单独的单例,该单例跟踪数据并且是所有子类的依赖项。不是世界末日,但由于这“有效”,我想了解更多有关静态 getter 和 setter 用例的信息。
感谢您的浏览。
<小时/>更新:这是 JS Fiddle 的示例,它还演示了(在简化的测试用例中它应该如何工作:
- 使用
静态
的“工作”示例:https://jsbin.com/koruba/2/edit?js,console - 不使用
静态
的“不工作”示例:https://jsbin.com/koruba/3/edit?js,console
问题是:无论单例/pubsub 存储是否更好,在 Filters
父类(super class)中使用 static
是否有效?特别是 static set data (newData) {}
方法,因为它实际上访问 this._data
并且我被告知任何方法都是 static
> 我不能访问该立即函数之外的任何内容,并且由于 this._data
未作为参数传递到该方法中,因此我不应在此处使用 static
。
最佳答案
"Non working" example not using
static
是的,如果不使用static
,您的属性将在每个实例上单独设置,因此它们不会被任何东西共享。
I have been told that for any method to be
static
I must not access anything outside that immediate function and sincethis._data
is not passed into the method as an argument I should not usestatic
here.
无论谁告诉你这可能指的是实例属性。如果从实例方法调用静态方法,则无法使用 this
访问实例的属性,当然,这就是静态方法的全部要点。
但是,与其他方法调用一样,您可以访问所调用对象的属性,对于静态方法来说,该属性是类(构造函数)本身。使用 this._data
确实可以访问static Base._data
属性 - 这就是您在用例中想要的,所以完全可以使用它。
关于javascript - 访问 ES6 类中静态 setter 中的类数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39281427/