【问题标题】:With ES6 Classes, is it ok to return an instantiation of that class from a static method?使用 ES6 类,是否可以从静态方法返回该类的实例化?
【发布时间】:2017-03-17 17:28:07
【问题描述】:
class Thing {
  constructor(parameter) {
    if (parameter) {
      this.x = parameter;
    }
    return this;
  }

  getX () {
    return this.x;
  }

  static specialThing() {
    return new Thing('Special Thing');
  }
}

let thingy = Thing.specialThing();
thingy.getX(); // 'Special Thing'

我想在 JavaScript 中执行上述操作(尽管形式更复杂)。当我运行这段代码时,它目前运行良好,但我对在一个类中让一个函数返回该类的实例化版本感到奇怪。有什么理由不以这种方式构建我的代码吗?

静态方法的替代方法是:

Thing.specialThing = () => {
  return new Thing('Special Thing');
};

使用其中任何一种都有哪些优点和缺点(如果有的话)?还有其他更好的方法来实现我不知道的这个目标吗?

【问题讨论】:

  • 这完全没有问题。
  • 这种结构在其他语言中非常常见,你可能在 js 中没有看到它的唯一原因是因为类是 javascript 的新手..
  • 非常感谢@Pointy 和@Pamblam 的回复!也是一般性问题 - 为什么用答案而不是回答来评论?
  • 好吧,我不能代表任何人发言,但如果这只是意见问题,而且我不认为自己是专家,我会发表评论。换句话说,我无法对为什么这是一种好的做法提供全面的解释和辩护。
  • 好吧,这是有道理的。谢谢你启发我!

标签: javascript class static ecmascript-6 es6-class


【解决方案1】:

对于 ES6 类,是否可以返回该类的实例化 来自静态方法?

当然,这很好,在某些情况下这是一种公认​​的做法。当您想要将可重用函数编码为可从多个位置调用的可重用函数时,通常会使用它,这是调用构造函数和创建对象的特定方式。

名为specialThing 的静态函数称为工厂函数(为您创建并返回对象的常规函数​​)。工厂函数可以是您展示的静态方法、其他类型对象的方法或只是常规函数(基本上任何类型的函数,无论是否静态)。

因此,假设您的代码中有四个位置都创建了相同类型的对象,并且构造函数具有相同或几乎相同的参数。无需将该代码复制到四个位置,您只需创建一个为您完成所有常见工作的共享函数,然后您可以在多个位置使用它,就像将任何其他通用代码放入共享函数中一样。除非您创建和返回对象,否则该类型的共享函数具有特定名称(工厂函数)。正如我之前所说,工厂函数可以是任何类型的函数(任何最适合您的编码设计的函数),因此静态方法当然是可接受的编码方式之一。

【讨论】:

    【解决方案2】:

    对于 ES6 类,是否可以从静态方法返回该类的实例化?

    是的,在函数式编程中也很常见

    class Box {
      constructor (value) {
        this.value = value
      }
      fmap (f) {
        return Box.of (f (this.value))
      }
      concat ({value}) {
        return Box.of (this.value + value)
      }
      static of (value) {
        return new Box (value)
      }
    }
    
    const sq = x => x * x
    
    let b = Box.of(3).fmap(sq).concat(Box.of(4).fmap(sq))
    
    console.log (b)
    // { Box 3*3 + 4*4 }
    // { Box 25 }

    【讨论】:

      猜你喜欢
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多