javascript - 访问 ES6 类中静态 setter 中的类数据

标签 javascript class static ecmascript-6 es6-class

我试图实现以下目标:将子类的数据存储在父类(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 的示例,它还演示了(在简化的测试用例中它应该如何工作:

问题是:无论单例/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 since this._data is not passed into the method as an argument I should not use static here.

无论谁告诉你这可能指的是实例属性。如果从实例方法调用静态方法,则无法使用 this 访问实例的属性,当然,这就是静态方法的全部要点。
但是,与其他方法调用一样,您可以访问所调用对象的属性,对于静态方法来说,该属性是类(构造函数)本身。使用 this._data 确实可以访问static Base._data 属性 - 这就是您在用例中想要的,所以完全可以使用它。

关于javascript - 访问 ES6 类中静态 setter 中的类数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39281427/

相关文章:

javascript - 如何使用 JQ 删除/重置外部 css 样式?

c++ - 函数范围内的静态声明和定义不会改变?

c++ - C++ 中无法解析的外部符号(使用 VS2017)

javascript - 递归搜索JSON并删除某些子对象

javascript - 如何将外部 CSS 文件分配给 javascript 构造的 SVG 对象?

javascript - 选项卡关闭时 anchor 跳转链接不起作用

C++ 如何格式化指向类数组的指针?

java - 如何创建一个类的实例,并将字符串数组作为唯一的实例变量?

javascript - 从 Vue.js 组件数据中导入的辅助类调用函数

c - 错误 C4700 : uninitialized local variable "" used