繁体   English   中英

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

[英]With ES6 Classes, is it ok to return an instantiation of that class from a static method?

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

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

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

当然可以,这在某些情况下是可接受的做法。 当您希望将其编码为可重用的函数时,通常可以使用该函数,该函数可以从多个位置调用以一种特定的方式调用构造函数并创建对象。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM