我可以控制 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。
有些地方可以查到:
Calling Javascript Factory Method
希望对您有所帮助!
你可以使用工厂函数:
class Test {
}
function getInstance() {
if (!Test._instance) {
Test._instance = new Test();
}
return Test._instance;
}
不,当使用 new
(或 super()
)调用 (non-derived) 构造函数时,对象在任何自定义代码运行之前就已经实例化了1 。但是,JS 允许您通过从构造函数 return
ing 一个对象来覆盖表达式的结果值。你可以写
const CACHE = new Map();
class Something {
constructor(someArgument) {
if (CACHE.has(someArgument)) return CACHE.get(someArgument);
// ^^^^^^
CACHE.set(someArgument, this);
// initialise `this`
}
}
也就是说,工厂函数(甚至是静态方法)——如其他答案所建议的——通常是更明智的解决方案。如果绝对需要强制执行此操作,则只需将缓存处理代码放在构造函数中。
1:可能会被代理的construct
陷阱拦截,但一般不会用到
在 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。
有些地方可以查到:
Calling Javascript Factory Method
希望对您有所帮助!
你可以使用工厂函数:
class Test {
}
function getInstance() {
if (!Test._instance) {
Test._instance = new Test();
}
return Test._instance;
}
不,当使用 new
(或 super()
)调用 (non-derived) 构造函数时,对象在任何自定义代码运行之前就已经实例化了1 。但是,JS 允许您通过从构造函数 return
ing 一个对象来覆盖表达式的结果值。你可以写
const CACHE = new Map();
class Something {
constructor(someArgument) {
if (CACHE.has(someArgument)) return CACHE.get(someArgument);
// ^^^^^^
CACHE.set(someArgument, this);
// initialise `this`
}
}
也就是说,工厂函数(甚至是静态方法)——如其他答案所建议的——通常是更明智的解决方案。如果绝对需要强制执行此操作,则只需将缓存处理代码放在构造函数中。
1:可能会被代理的construct
陷阱拦截,但一般不会用到