2
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');
};

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

4

2 回答 2

3

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

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

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

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

于 2016-11-04T00:20:49.207 回答
1

使用 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 }

于 2016-11-04T03:05:25.003 回答