javascript - 在内存中查找实例

标签 javascript

我有一个由多个产品共享的“通用”库。我们有一个“最佳实践”或一种模式,我们期望特定的实例化使用特定的名称,以便可以共享它。因此,例如,在产品中您可能会看到:

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/

相关文章:

javascript - Stormpath 自定义数据

javascript - React Hot loader 3 与 webpack-dev

javascript - Socket.IO 服务器的奇怪行为

javascript - 让ExternalInterface与所有浏览器一起工作的优雅方式

javascript - 为什么库上设置的 "developmentMode"标志被忽略?

javascript - 我如何测试元素是否在 JavaScript 中自封闭?

javascript - 如何在jquery中选择一个div并将其替换为iframe

javascript - 带暂停的jquery自动滚动网站

javascript - 使用 jquery 翻转图像

javascript - 如何将textarea的默认滚动条改为小滚动条?