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

时间:2016-11-03 23:56:31

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

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

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

2 个答案:

答案 0 :(得分:3)

  

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

当然,这很好,在某些情况下这是公认的做法。当你想要编译成可重用的函数时,通常会使用它,可以从几个地方调用一个特定的方法来调用构造函数和创建一个对象。

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

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

答案 1 :(得分:1)

  

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

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



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 }