【问题标题】:Private method and normal function in a module模块中的私有方法和普通函数
【发布时间】:2021-02-04 04:06:06
【问题描述】:

考虑到我有以下模块:

class Rectangle {
  private width: number;
  private height: number;

  constructor(w: number, h: number) {
    this.width = w;
    this.height = h;
  }

  private area(): number {
    return w * h;
  }

  public show(): void {
    console.log(`${w} X ${h} = ${this.area()}`);
  }
}

export default Rectangle;

如您所见,area 方法设置为private,因此我可以将其移出类并将其转换为普通函数。因为我不导出它,它不能从外部代码访问。

const area = (w: number, h: number): number => w * h;

class Rectangle {
  private width: number;
  private height: number;

  constructor(w: number, h: number) {
    this.width = w;
    this.height = h;
  }

  public show(): void {
    console.log(`${w} X ${h} = ${area(this.width, this.height)}`);
  }
}

export default Rectangle;

如果我这样做,每次我 new Rectangle 类时,area 将不会再次创建,因此我的 Rectangle 对象将比具有 private 的对象更轻量级方法。我对么?我应该这样做还是坚持原来的 OOP 方式?

【问题讨论】:

  • 该函数存在于对象原型中,因此我认为不会对性能产生太大影响,但这不是我的专业领域。至于将函数移到外面,将矩形作为参数而不是单独的宽度和高度参数更有意义。如果你走那条路,你可能根本就没有课。只需将 Rectangle 设置为具有高度和宽度的接口,并定义作用于 Rectangle 对象的函数即可。
  • 接受两个数字的area 函数不是很有用。你只是在做乘法,所以你也可以抽象为 multiply = (a, b) => a * b - 它可以比area 更有效地重用。但是,如果area 采用Rectangle,那就更好了,因为它可以与您的具体类型一起使用。必须调用area(rectangle.height, rectangle.width) 并不是一个好的抽象,您仍然必须知道如何计算面积才能调用计算面积的函数。

标签: javascript typescript performance oop methods


【解决方案1】:

如果我这样做,每次我 new Rectangle 类时,area 将不会再次创建,因此我的 Rectangle 对象将比具有 private 的对象更轻量级方法。我说的对吗?

不,你不是。类的方法存储in the prototype 的实例。它不是存储在每个实例中。对性能或内存没有影响。

我应该这样做还是坚持原来的 OOP 方式?

我个人更喜欢在类之外声明独立的函数。它是a functional approach。但这是编码风格的问题。

注意:如果你坚持 OOP 范式,当一个方法不使用 this 时,它应该是 static

【讨论】:

    【解决方案2】:

    这不会改变对象的重量,因为它在对象原型上。但如果此方法不依赖于类属性,那么它应该/可以是静态的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-24
      • 2012-01-04
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      • 2013-03-24
      • 2015-04-22
      • 1970-01-01
      相关资源
      最近更新 更多