Javascript 在ES6类的静态setter中访问类数据
我试图实现以下目标:将子类中的数据存储在超类中 下面的示例在实践中确实有效,但我被告知,在下面的示例中使用Javascript 在ES6类的静态setter中访问类数据,javascript,class,static,ecmascript-6,es6-class,Javascript,Class,Static,Ecmascript 6,Es6 Class,我试图实现以下目标:将子类中的数据存储在超类中 下面的示例在实践中确实有效,但我被告知,在下面的示例中使用static get | set x(){}是不正确的,因为setter方法使用这个,因此,setter不再是静态的 示例: 'use strict'; // base.js class Base { constructor () {} static get data () { return this._data; } static se
static get | set x(){}
是不正确的,因为setter
方法使用这个,因此,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访问器的无效用例,那么我可能必须将数据存储功能拆分为一个单独的单例,它跟踪数据,并且是所有子类的依赖项。这不是世界末日,但由于这“有效”,我想了解更多关于静态getter和setter的用例
谢谢你看
更新:下面是一个JS提琴示例,它还演示了(在简化的测试用例中)它应该如何工作:
- 使用
静态的“工作”示例:
- “非工作”示例未使用
静态:
问题是:无论singleton/pubsub存储是否更好,在过滤器
超类中使用静态
是否有效?尤其是静态集数据(newData){
方法,因为它实际上访问这个。_data
我被告知,对于任何要静态的方法,我不能访问该立即函数之外的任何东西,因为这个。_data
没有作为参数传递到方法中,我不应该在这里使用静态
“非工作”示例未使用static
是的,通过不使用static
您的属性将在每个实例上分别设置,因此它们不会被任何对象共享
我被告知,对于任何要静态的方法
,我不能访问该立即函数之外的任何内容,因为此函数。_数据
没有作为参数传递到方法中,我不应该在这里使用静态
告诉您这一点的人可能引用了实例属性。如果您从实例方法调用静态方法,则无法使用this
访问实例的属性。当然,这就是静态方法的全部要点。
然而,就像在其他方法调用中一样,您可以访问所调用对象的属性,对于静态方法,该对象是类(构造函数)本身。使用这个。_data
确实访问静态基。_data
属性-这就是您在用例中想要的,所以使用它是完全正确的。那么…问题是什么?它按预期工作,不是吗?它应该如此。这条语句setter方法使用这个。_data,它不在当前乐趣的上下文中操作是错误的。此
用于Base.data…
是Base
。但是如果在一个位置使用Base.data
,在另一个位置使用B.data
,它将不会像预期的那样工作。但是,如果使用对象保留对原型的数据
的引用,它将再次工作。分配(此。\u data,newData)
而不是每次都重新分配它。在孩子们中它可以被称为this.constructor.data
。不管怎样,整个事情看起来相当笨拙,单例存储听起来像是一个更好的设计选项。“我遇到的问题是a.js只会跟踪a.js的数据,而不知道b.js的数据。”-你能展示你的实际代码吗,特别是你是如何要求所有模块和日志Base.data
?是的,一个单独的单例将比将其与基类卷积更好。甚至比单例更好的是将PubSub store作为一个动态参数传递。@estus,@Bergi:我已经用clarif更新了这个问题说明和示例,包括它在不使用静态
set/get方法时“工作”的方式和“不工作”的方式。谢谢,所以静态
方法只有在“只对提供给它的参数工作”的情况下才是静态的不是完全正确吗?我只是试图通过访问this.\u data
或者如您所解释的Base.\u data
来判断我是否违反了该规则。尽管它没有被传递到静态集数据(newData){}
方法中,但它仍然有效。根据我的理解,该“规则”方法应该被定义为集数据(newData,baseData){}
是真正静态的,但考虑到Base.\u data
是实际操作的目标,这似乎有些奇怪。@Jannis No,“仅对提供给它的参数有效”将是一个“静态”的意思,本质上是“不特定于实例”.尽管有副作用的静态方法被认为是不好的做法,原因与单例是一样的。啊,很好,现在这一切都是有意义的,而且这个方法除了它的基之外,不会改变任何东西的状态。_data
target(并用它的方法访问它)这意味着它不被认为是副作用,对吗?但当然,Base.\u data
是一个全局“变量”,对其进行变异是一个副作用。Base
在这方面实际上是一个单例对象。很好,现在我明白了:我的示例中的静态get/set是有效的,因为它们不是特定于实例的,但也是一个糟糕的实践