【问题标题】:Efficient and elegant way to create nested ES6 classes?创建嵌套 ES6 类的高效优雅方式?
【发布时间】:2019-10-23 22:44:46
【问题描述】:

在试图找到一种在 JS 中使用嵌套类的方法时,我想出了这样的事情:

class Character {
    constructor() {
        this.Info= class I {
            constructor(name,value) {
                this.name=name;
                this.value=value;   
            }
        };
    }
    bar () {
        var trial = new this.Info("Goofy", 2);
        alert(trial.name);
    }
}

var test = new Character();
test.bar();

而且它似乎有效。但是,我担心这可能会为每个new 调用创建一个新的函数对象,因为我在构造函数中定义了类(在每个new 调用中执行)。有没有更有效的方法来做到这一点?

This question 不能解决我的问题,因为作者只是想知道如何嵌套class;我已经能够做到这一点,但我想知道是否有更有效的方法。

【问题讨论】:

  • 您是否考虑过将 Info 创建为 static method
  • 不错,但我想这意味着退回到function 语法?我希望能够使用class
  • Nested ES6 classes?的可能重复
  • @filipe 我已经编辑解释了为什么我的问题不同
  • 所以.. 最有效的方法是使用任何可用的命名法将其设为静态,或者不嵌套它!

标签: javascript class oop object


【解决方案1】:

在 react、angular 中使用静态属性或仅使用 babel,因为目前并非所有浏览器都实现直接静态类属性。

class Character {

    static Info = class I {
        constructor(name) { this.name=name; }
    }

    bar () {
        return new Character.Info("Goofy");
    }
}

const test = new Character();
console.log(test.bar());

以旧方式使用静态属性——目前适用于所有浏览器。

class Character {
    bar () { return new Character.Info("Goofy"); }
}

Character.Info = class I {
    constructor(name) { this.name=name; }
}

const test = new Character();
console.log(test.bar());

【讨论】:

  • 酷,我没有足够快地找到正确的语法。 :-)
  • 提出了一个问题:为什么没有一种简单的方法可以从构造函数中引用构造函数?这样可以更轻松地调用静态方法。
  • @RobG,因为在构造函数中还没有创建对象。
  • 那么可能不是一个好的解决方案。在当前 Edge、Safari 和 Firefox 中失败。 :-(
  • “我们”并不都使用 babel。我不能支持引入这样的依赖,这真的比说“使用库X”更好。
【解决方案2】:

也许您给出的示例太简单,无法演示您要解决的任何问题,但在我看来,您根本不需要嵌套它们。

class Info {
  constructor(name, value) {
    this.name = name;
    this.value = value;
  }
}

class Character {
  bar() {
    var trial = new Info("Goofy", 2);
    console.log(trial.name);
  }
}

const test = new Character();
test.bar();

【讨论】:

  • 我完全同意。嵌套类使其看起来像一个命名空间。好吧,我们已经有了模块。嵌套两个类最有效的方法是不嵌套它们!
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多