javascript getter 和 setter 在对象 属性 内 class

javascript getter and setter within object property within class

正如我们所知,getters 和 setter 基本上是允许计算属性的函数,同时保持像属性一样访问它们的简单性,而不是 methods/functions。

我发现这对新的私人 class 成员特别有用,这可能相关也可能不相关。

示例:

class A {
    #a;
    constructor() {
        this.#a = "something";
    }
    get a() {
        // do some stuff that a depends on a...
        // ... and then ultimately return it: 
        return this.#a;
    }
    set a(arg) {
        // do some stuff that depends on a or vice versa...
        // ... and then ultimately set a to something: 
        this.#a = something();
    }
}

当然,它看起来像两个“函数”,但我以 属性:

的形式访问它
const aObj = new A();
console.log(aObj.a);  // runs the getter
aObj.a = "x"; // runs the setter

所以现在......我正在尝试获得相同的功能,但是 a(以及一堆其他属性)在 class 的顶层并不总是松散的,但其中一些是 class 中对象定义中的属性。类似于:

class B {
    #innerObjProp;
    constructor() {
        this.#innerObjProp = {};
        this.#innerObjProp.b = "b";
    }
    get this.#innerObjProp.b() {
        // do some stuff that b depends on...
        // ... and then ultimately return it: 
        return this.#innerObjProp.b;
    }
    set this.#innerObjProp.b(arg) {
        // do some stuff that depends on b or vice versa...
        // ... and then ultimately set b to something:
        this.#innerObjProp.b = something();
    }
}

据我所知(根据我的 IDE),上面的 getset 语法不正确,但希望它能说明我正在尝试做的事情。

(#innerObjProp#a 在这些示例中是私有的,这在我当前的情况下是需要的,但这不是问题的关键。大概如果有办法这样做,私有属性和 public 属性都是一样的。)

谁能告诉我这是否可行,如何实现?

在此先感谢您的帮助!


2小时后,更新。上面的几个代码更正。另外,感觉有必要根据评论中的问题澄清一些事情:

TL;DR,简短版本:我正在寻找概念上的东西:

this.#innerObjProp.(get b(){ 
    return ... ;
});
this.#innerObjProp.(get c(){ 
    return ... ;
});

我知道这不是正确的语法,但我找不到任何地方显示它应该是什么。


更多细节。 如果以上内容足够清楚,请跳过此步骤:

我的节点命令行应用程序连接到一个 API,它正在流式传输持续更新的数据。我可以访问 2 或 3 个大型 API 对象,其中包含我需要的一切,并且不断更新。我随时都有最新的数据,但它经常变化(有些超过 1/秒)。我不需要对其中任何一个的写入权限,只需要读取。它绝对需要针对我的应用程序以不同于交付给我的方式进行组织,否则我的代码将成为一场组织噩梦。

所以我的 classes,一些是静态的,一些是实例化的,是只读属性的集合,需要动态派生。我有几个 classes 几乎什么都不做,只是重新排列所有内容并根据需要将位分发给应用程序的其余部分。

在我看来,getter 对其中的每一个都是一个很好的选择,每个都有我的应用程序更喜欢的名称,从 API 对象中即时读取,进行一些调整(它们是派生的计算属性)并将该结果传送到我的应用程序中要求它的任何其他地方。

在我弄明白之前,我只是在 classes 的顶层组织所有这些属性,但我更愿意将其中一些组合在一起。这就是 innerObjProp 之类的东西的用武之地。

最后,我需要先使用几个组中的一些属性,然后才能访问所有这些属性。因此,感谢下面的@Bergi,this.#innerObjProp = { get ...(), get...(), get...()} 一开始可以工作,但我无法弄清楚稍后在代码中向其添加另一个 getter 的语法,就像我可以使用普通的 属性例如。 this.#innerObjProp.c = ....

I'm trying to do is get that same functionality, but where the property is not loose on the top level of the class, but within an object property inside the class.

然后你需要先在某个地方创建那个对象。由于您希望每个实例都有一个单独的对象(具有不同的 属性 值),因此在构造函数中创建该特定于实例的对象:

class B {
    #innerObjProp;
    constructor() {
        this.#innerObjProp = {};
    }
}

然后在 that 对象中定义你的 getters/setters,而不是在 class 级别上,使用 getters/setters 中的常用 ES5 语法对象文字:

class B {
    #innerObjProp;
    constructor() {
        let b = "b"; // a local variable as a place to store the value
        this.#innerObjProp = {
            get b() {
                // do some stuff that b depends on...
                // ...
                // ... and then ultimately return it: 
                return b;
            },
            set b(arg) {
                // do some stuff that depends on b or vice versa...
                // ...
                // ... and then ultimately set b to something:
                b = something();
            }
        };
    }
}

请注意,这是一种代码味道。如果您的 class 变得太大以至于您不想在其“顶层”放置一些东西,那么您的设计有问题,您应该考虑将 class 拆分为多个较小的 classes.