【问题标题】:Performance of javascript static class inherit non static classjavascript静态类继承非静态类的性能
【发布时间】:2019-02-15 12:30:55
【问题描述】:

我已经构建了一个对 dom 执行操作的 javascript 类。为了尽可能简化外部的使用,我现在有这样的方法:

hello.add(id);
hello.delete(id);
hello.select(id);

为了完成上述工作,我设置了一个使用非静态类的静态类,如下所示:

静态类

class hello {
  static add(id) {
    let hello = new HelloCore();
    hello.add(id);
  }

  static delete(id) {
    let hello = new HelloCore();
    hello.delete(id);
  }

  static select(id) {
    let hello = new HelloCore();
    hello.select(id);
  }
}

非静态类

真正的代码是 500 行加上一个构造函数等等。

class helloCore() {
  add() {
    // Do something
  }

  delete() {
    // Do something
  }

  select() {
    // Do something
  }
}

现在超级简单,但我想知道这种方法是否存在性能问题。我的猜测是它在每次静态调用时都会将一个新的 javascript 对象存储到内存中?

  1. 我需要担心吗?
  2. 如果是,有什么更好的方法,但仍然超级简单?

我想远离什么

从一开始我就一直需要将对象传递给将要使用它的函数。见下文。

let hello = new HelloCore();

function my_function(hello) {
  let id = 2;
  hello.add(id);
}

my_function(hello);

使用静态方法,我不需要到处传递对象。我可以从任何地方触发该功能。

我可以使用全局 var hello = new Hello();,但我需要确保它首先被加载,我不会忘记它,这意味着用户需要额外的代码。

【问题讨论】:

  • 使用静态类方法,hello实例在函数调用后不再可用......
  • 我会一直传递对象。它是基本的依赖注入,使您的代码更灵活/可扩展/可重用,更容易测试,并且在过程中不那么晦涩。
  • 此时,阅读您的代码,我想知道为什么 helloCore 不是静态的。目前,您的hello 静态类中存在信息丢失,因为内部helloinstance 丢失了。是否有任何“真实”的代码示例更接近您想要实现的目标?
  • 您应该永远创建一个只包含static 方法的class。您可以轻松地使用对象文字,因为您不打算实例化任何东西,所以这会更有效和更合适。在你的情况下:const hello = { add(id) { new HelloCore().add(id); }, delete(id) { new HelloCore().delete(id); }, … };
  • @JensTörnell 是的:它不会创建永远不需要的构造函数和原型对象(甚至可能被滥用,或者至少会让读者感到困惑)。

标签: javascript performance class static es6-class


【解决方案1】:

您可能想看看Singleton
它完全符合您的目标。

但是,我必须承认,我(和许多其他开发人员)不赞成单例、全局和静态类,不是因为性能,而是作为一种通用模式。
This SO question 稍微解释了为什么单例不好。

【讨论】:

    【解决方案2】:

    @mareful 评论了这个有用的信息:

    使用静态类方法,hello 实例在函数调用后不再可用...

    这意味着静态类在每次调用后都会自我清理。

    然后我收到了来自@Bergi 的评论,我想使用const 包括具有相同结果的函数。这种方法效果很好。

    之前 - 使用静态类

    class hello {
      static add(id) {
        let hello = new HelloCore();
        hello.add(id);
      }
    
      static delete(id) {
        let hello = new HelloCore();
        hello.delete(id);
      }
    
      static select(id) {
        let hello = new HelloCore();
        hello.select(id);
      }
    }
    

    之后 - 使用 const

    const hello = {
      add(id) {
        new HelloCore().add(id);
      },
      delete(id) {
        new HelloCore().delete(id);
      },
      select(id) {
        new HelloCore().select(id);
      }
    };
    

    在这两种情况下,我都可以将其称为 hello.add(id);const 版本更短,在这种情况下也有一些其他优势。

    它不会创建永远不需要的构造函数和原型对象(甚至可能被滥用,或者至少会让读者感到困惑)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 1970-01-01
      • 2022-08-20
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多