我有一个由多个产品共享的“通用”库。我们有一个“最佳实践”或一种模式,我们期望特定的实例化使用特定的名称,以便可以共享它。因此,例如,在产品中您可能会看到:
var manager = new Manager();
但是,我们喜欢使用对象文字来实现命名空间目的,因此理想的情况实际上是:
myApp.manager = new Manager();
我们目前还没有采用这种更理想的方式,因为那样通用代码就没有很好的方式来了解管理器。回到共享代码,由于管理器是可选的(否则这个讨论甚至不会成为讨论),我们有这样的东西:
if (typeof manager !== "undefined") {
// do stuff
}
如果有可用的经理,那么最好检查所有产品,而不必强制执行该命名约定。
问题
有没有一种方法可以在不迭代整个全局范围的情况下找到“Manager”的实例?一句台词是“给我第一个(或所有)Manager 实例”?
我从来没有遇到过这样的事情,所以我猜他们只会扬起眉毛并说“不......你疯了......”,但我认为这可能值得一问。
<小时/>更新
因此,最初的问题被保留为通用问题,但随着答案和评论的不断涌现,我意识到我的具体实现很重要,这让我感到很困惑。因此,将其分解为更小的部分,这是单例的实际工作方式:
var Manager = (function() {
// the actual constructor
function ManagerConstructor(opts) {
// all the things that the manager actually does
}
var instance;
// functions that are exposed on the Manager object; namely, just a way to invoke the constructor
var exposed = {
getInstance: function(opts) {
if(typeof instance === "undefined") {
instance = new ManagerConstructor(opts);
}
return instance;
}
};
return exposed;
})();
(肯定还有改进的空间)
然后当需要经理时:
// in another file
var someManager = Manager.getInstance(opts); // opts only used
现在......事后看来,我不确定我们是否需要以这种方式实现它。一般来说,这种模式有优点也有缺点,随着时间的推移,针对我们的特殊需求,缺点也会越来越多(尽管我仍然认为它在其他地方很有用!)。但这是重构讨论的问题;不想污染原来的具体问题!
最佳答案
将其保存在 Manager
类本身中。
function Manager() {
if (!Manager.manager) {
Manager.manager = this;
}
...
}
然后你可以使用:
if (!Manager.manager) {
// do stuff
}
关于javascript - 在内存中查找实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52207849/