在 ES6 classes 中以静态 setter 访问 class 数据
Accessing class data in static setter in ES6 classes
我正在尝试实现以下目标:将来自子类的数据存储在超类中。
下面的例子在实践中确实有效,但我被告知在下面的例子中使用 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 访问器的无效用例,我可能不得不将数据存储能力拆分为一个单独的单例来跟踪数据并且是所有子类的依赖项。不是世界末日,但自从这个 "works" 我想了解更多关于静态吸气剂和 setters 的用例。
感谢观看。
更新: 这是一个 JS Fiddle 示例,它还演示了(在简化的测试用例中它 应该如何 工作:
- "Working" 使用
static
的示例:https://jsbin.com/koruba/2/edit?js,console
- "Non working" 不使用
static
的示例:https://jsbin.com/koruba/3/edit?js,console
问题是:无论 singleton/pubsub 存储是否更好,在 Filters
超类中使用 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 since this._data
is not passed into the method as an argument I should not use static
here.
谁告诉你的,可能指的是实例属性。如果从实例方法调用静态方法,则无法使用 this
访问实例的属性,当然,这就是静态方法的全部意义。
但是,就像在所有其他方法调用中一样,您可以访问被调用对象的属性,对于静态方法而言,它是 class(构造函数)本身。使用 this._data
确实可以访问 static Base._data
属性 - 这就是您在用例中想要的,因此完全可以使用它。
我正在尝试实现以下目标:将来自子类的数据存储在超类中。
下面的例子在实践中确实有效,但我被告知在下面的例子中使用 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 访问器的无效用例,我可能不得不将数据存储能力拆分为一个单独的单例来跟踪数据并且是所有子类的依赖项。不是世界末日,但自从这个 "works" 我想了解更多关于静态吸气剂和 setters 的用例。
感谢观看。
更新: 这是一个 JS Fiddle 示例,它还演示了(在简化的测试用例中它 应该如何 工作:
- "Working" 使用
static
的示例:https://jsbin.com/koruba/2/edit?js,console - "Non working" 不使用
static
的示例:https://jsbin.com/koruba/3/edit?js,console
问题是:无论 singleton/pubsub 存储是否更好,在 Filters
超类中使用 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
访问实例的属性,当然,这就是静态方法的全部意义。
但是,就像在所有其他方法调用中一样,您可以访问被调用对象的属性,对于静态方法而言,它是 class(构造函数)本身。使用 this._data
确实可以访问 static Base._data
属性 - 这就是您在用例中想要的,因此完全可以使用它。