我可以控制 class 在 ES6 中的创建方式吗?

Can I control how the class is being created in ES6?

在 Python3 中,我可以使用魔术函数 __new__,它在 class 初始化之前执行。这有助于我控制是创建新实例还是使用缓存中的某个实例。

只是一个简单的例子:

class Something:
    def __new__(..., someArgument):
       # was a class with someArgument initialized somewhere before?
       # is yes, then:
           return CACHE[someArgument]
       # if no, then:
           CACHE[someArgument] = Something(someArgument)
           return CACHE[someArgument]

那么,我可以在 ES6 中做同样的事情吗?或者我如何控制 class 以其他方式初始化?

这个问题不是this one的重复问题,因为我问的是我是否可以在 JS 中找到一些功能,而上面的主题包含对这个功能的讨论。

正如 Justinas 评论的那样,您可以查看 Javascript Factory

一个Javascript Factory定义一个创建对象的接口,但是让subclasses决定实例化哪个class。 Factory Method 让 class 将实例化延迟到子 classes。

有些地方可以查到:

Factory Method Design Pattern

Factory Functions with ES6

Calling Javascript Factory Method

希望对您有所帮助!

你可以使用工厂函数:

class Test {

}

function getInstance() {
  if (!Test._instance) {
    Test._instance = new Test();
  }

  return Test._instance;
}

不,当使用 new(或 super())调用 (non-derived) 构造函数时,对象在任何自定义代码运行之前就已经实例化了1 。但是,JS 允许您通过从构造函数 returning 一个对象来覆盖表达式的结果值。你可以写

const CACHE = new Map();
class Something {
    constructor(someArgument) {
        if (CACHE.has(someArgument)) return CACHE.get(someArgument);
//                                   ^^^^^^
        CACHE.set(someArgument, this);
        // initialise `this`
    }
}

也就是说,工厂函数(甚至是静态方法)——如其他答案所建议的——通常是更明智的解决方案。如果绝对需要强制执行此操作,则只需将缓存处理代码放在构造函数中。

1:可能会被代理的construct陷阱拦截,但一般不会用到