代码之家  ›  专栏  ›  技术社区  ›  Aaron Balthaser

节点JS类实例化预期行为

  •  0
  • Aaron Balthaser  · 技术社区  · 8 年前

    我很好奇,当您创建如下类时,这个类是否会成为每个文件导入的新实例。

    class _Http {
    
    }
    
    let Http = new _Http();
    export default Http;
    

    每次我需要或导入文件时都会更新这个类。例如:

    如果我将文件导入view/splash。js,然后进入视图/组。js如下:

    从“../”导入http/UTIL/http’;

    这是同一个实例吗?我已经读到,这是一个单例模式,但似乎导入会更新实例。

    1 回复  |  直到 8 年前
        1
  •  4
  •   T.J. Crowder    8 年前

    每次我需要或导入文件时都会更新这个类。

    否。您导出的是 变量 Http 。该变量的初始化只发生一次(给定代码)。

    如果我将文件导入 view/splash.js 然后进入 view/groups.js 具体如下:

    import http from '../../utils/http';
    

    这是同一个实例吗?

    对这是同一个变量(从技术上来说 实时绑定 变量),它只能包含一个内容(在本例中,是对您创建的实例的引用)。

    事实上,如果您的代码在模块中定义它 已更改 在某一点上,该更改将在使用它的所有模块中可见。您真正导出的是到变量的实时链接,而不是其值的副本。(采用ES2015模块语法并将其转换为其他语法的东西可能无法完美地保留这些语义,但这就是它的定义方式。)

    例如,如果您有:

    export let a = 0;
    setInterval(() => { // For demonstration purposes only
        ++a;
    }, 500);
    

    然后像这样使用它:

    import { a as theVar } from './mod.js';
    const display = document.getElementById("display");
    setInterval(() => {
        display.innerHTML = String(theVar);
    }, 50);
    

    在此页面中:

    <body>
      <p id="display"></p>
      <script type="module" src="script.js"></script>
    </body>
    

    在像当前Chrome这样的浏览器上,您会看到对ES2015+模块的本机支持 script.js 查看更改 mode.js 使成为 a 在its中 theVar 结合 Live example (同样,需要支持模块的尖端浏览器)