首页 > 解决方案 > 在整个代码 javascript 中使用相同的实例

问题描述

Class Life {
   constructor(name = 'no name') {
     this.name = name;
   }
   getName() {
     return this.name;
   }
   setName(name = 'no name') {
     this.name = name;
   }
}

const MyLife = new Life();
export { getName, setName } = MyLife;
export default MyLife;

如何在整个代码中使用相同的new Life()ie实例MyLife

我尝试过的事情;

const MyLife = new Life();
export const getName = MyLife.getName.bind(MyLife);
export const setName = MyLife.setName.bind(MyLife);
export default MyLife;

每次我尝试在另一个文件中使用它时,即myOther.js

从 '../path-of-class.js` 导入 { setName } setName('Luke Skywalker'); // 我得到未定义。

我在这里做错了什么?

PS:该类在另一个库中,我用 webpack 编译它然后在另一个库中使用,<package>如果在同一个本地使用,上面的类可以正常工作,<package>但是当我尝试使用 from <package-a>to <package-b> 我得到setName未定义的。

标签: javascript

解决方案


尝试将您的 Life 实例保存到可能靠近类的静态变量中,并使用静态方法返回它

class Life {
   static getInstance() {
     if (!Life.instance) {
       Life.instance = new Life();
     }
     return Life.instance;

   }
   constructor(name = 'no name') {
     this.name = name;
   }
   getName() {
     return this.name;
   }
   setName(name = 'no name') {
     this.name = name;
   }
}

Life.instance = null;

export default Life;

在另一个文件中:

import Life from 'module';
const myLife = Life.getInstance();

我不完全确定 webpack 如何处理导入。但是拥有一个类的单个实例并在任何地方使用它是面向对象编程(查找单例)中的常见模式,通常通过将实例的静态变量附加到类并使用静态方法获取它来解决。这个例子通过使用一个 staticinstance并使用getInstance()它来返回它或创建一个(如果还没有的话)来实现同样的事情。这是该模式的经典实现。


推荐阅读