Ino*_*ani 5 javascript es6-modules
下面的代码片段每次导入时都会生成新实例吗?
// 1st implementation
class ConnectionManager {
...
}
export default new ConnectionManager();
Run Code Online (Sandbox Code Playgroud)
// 2nd implementation
class ConnectionManager {
...
}
const connectionManager = new ConnectionManager();
export default connectionManager;
Run Code Online (Sandbox Code Playgroud)
如果是,如何在每次导入中获得相同的实例?
ES6 模块遵循单实例模式。也就是说,在加载模块时创建实例。
这是一篇关于它的文章。
Run Code Online (Sandbox Code Playgroud)// File: yolo.js class Yolo {} export let yolo = new Yolo(); // File: laser.js import { yolo } from "./yolo.js"; // yolo is a single instance of Yolo class // File: cat.js import { yolo } from "./yolo.js"; // same yolo as in laster.js
小智 7
应该是一样的。
下面的示例使用这两种实现,将它们导入到 2 个不同的文件中,然后将它们全部导入到单个index文件中。每次创建实例时,我们都会value为该类生成一个随机数,并记录其创建。
// ConnectionManagerImpl1.ts
class ConnectionManagerImpl1 {
public value;
constructor() {
this.value = Math.random().toString(36).substring(7);
console.log(`New ConnectionManagerImpl1 instance created: ${this.value}`)
}
}
export default new ConnectionManagerImpl1();
Run Code Online (Sandbox Code Playgroud)
// ConnectionManagerImpl2.ts
class ConnectionManagerImpl2 {
public value;
constructor() {
this.value = Math.random().toString(36).substring(7);
console.log(`New ConnectionManagerImpl2 instance created: ${this.value}`)
}
}
const connectionManagerImpl2 = new ConnectionManagerImpl2();
export default connectionManagerImpl2;
Run Code Online (Sandbox Code Playgroud)
// import1.ts
import connectionManagerImpl1 from './ConnectionManagerImpl1';
import connectionManagerImpl2 from './ConnectionManagerImpl2';
export { connectionManagerImpl1, connectionManagerImpl2 };
Run Code Online (Sandbox Code Playgroud)
// import2.ts
import connectionManagerImpl1 from './ConnectionManagerImpl1';
import connectionManagerImpl2 from './ConnectionManagerImpl2';
export { connectionManagerImpl1, connectionManagerImpl2 };
Run Code Online (Sandbox Code Playgroud)
// index.ts
import * as import1 from './import1';
import * as import2 from './import2';
console.log(import1)
console.log(import2)
console.log("Done")
Run Code Online (Sandbox Code Playgroud)
运行上述设置使用 tsc --module 'commonjs' * && node index.js
输出:
New ConnectionManagerImpl1 instance created: ddt3re
New ConnectionManagerImpl2 instance created: uv5z6
{ connectionManagerImpl1: ConnectionManagerImpl1 { value: 'ddt3re' },
connectionManagerImpl2: ConnectionManagerImpl2 { value: 'uv5z6' } }
{ connectionManagerImpl1: ConnectionManagerImpl1 { value: 'ddt3re' },
connectionManagerImpl2: ConnectionManagerImpl2 { value: 'uv5z6' } }
Done
Run Code Online (Sandbox Code Playgroud)
如您所见,仅创建了1 个ConnectionManagerImpl1和实例ConnectionManagerImpl2。因此,两个实现都应该只创建 1 个实例。
Shi*_*tel -1
在创建 JavaScript 模块时使用导出语句从模块导出函数、对象或原始值,以便其他程序可以通过 import 语句使用它们。
有两种不同类型的导出:命名导出和默认导出。每个模块可以有多个命名导出,但只能有一个默认导出。
export default class ConnectionManager { .. }
Run Code Online (Sandbox Code Playgroud)
或者
class ConnectionManager {
...
}
export default connectionManager;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4313 次 |
| 最近记录: |