【问题标题】:How do you extend static properties in ES Next?如何在 ES Next 中扩展静态属性?
【发布时间】:2026-01-16 21:15:01
【问题描述】:

有时(尽管很少)您需要扩展而不是覆盖父静态属性,例如下面的(非常蹩脚的)示例:

class Person {
    static coreStats = {
        role: "slacker",
        weapon: null,
        speed: 4,
        vechicle: "roller blades",
    };
}

class Ninja extends Person {
    static coreStats = {
        role: "silent assassin",
        weapon: "katana",
        speed: 99,
    };
}

console.log(Ninja.coreStats); // But vechicle is no more

如何在不破坏父属性的情况下扩展子类中的静态属性?

【问题讨论】:

  • 出于好奇,静态属性(不是静态方法)是 ES6 的一部分吗?或者在某个地方是否有 TC39 提案?
  • 回滚编辑,因为我专门询问 ES2015。如果它在 2015 年不可用,很高兴答案是“在 es2015 中不可能”
  • 好吧,那么:在 ES 2015 中不可能,因为它首先不支持类属性。因此,如果您“专门询问 ES2015”,我真的很想知道这个问题是如何产生的 :)
  • @zeroflagL Gotcha - 根据阅读这篇文章,我认为静态是 ES6/ES2015 的一部分:2ality.com/2015/02/es6-classes-final.html 但我必须离开,因为那只是在谈论静态方法

标签: javascript ecmascript-next


【解决方案1】:

你可以这样做:

class Person {
    static coreStats = {
        role: "slacker",
        weapon: null,
        speed: 4,
        vechicle: "roller blades",
    };
}

class Ninja extends Person {
    static coreStats = Object.assign({}, Person.coreStats, {
        role: "silent assassin",
        weapon: "katana",
        speed: 99
    });
}
console.log(Ninja.coreStats);

这将合并 coreStats 并覆盖 Person.coreStatsNinja.coreStats 以防出现重复

【讨论】:

  • 在忍者中:static coreStats = Object.assign({}, Person.coreStats, { role: "silent assassin", weapon: "katana", speed: 99 }); ?
  • 根据@Apolo 的建议编辑了答案。现在看起来更干净了。
  • 这不好,当你做class Foo extends Person时会发生什么??
  • @Hitmands 我不确定我是否理解。我很确定 Dmittriy 的上述答案是正确的?
  • @Hitmands Foo.coreStats === Person.coreStats?那里有什么问题?