ES6 模块——创建不可变服务的最佳方法

ES6 modules - best approach for creating an immutable service

我正在使用以下方法在我的应用程序中创建类似单例的服务:

myService.js:

let myService = {};

myService.doSomething = function() {
    //doing something
};

export {myService};

在其他模块中的使用:

import {myService} from 'myService.js'

myService.doSomething();

export {myService};

通常这工作正常,但问题是可以在导入它的模块中修改服务:

import {myService} from 'myService.js'

myService.doSomething = function() {
    //do something different
};

export {myService};

这对于单例服务来说是不可取的,它应该是不可变的。

如何实现不变性?有人有完整的 different/better 方法来将不可变服务创建为 ES6 模块吗?

您好,我们可以使用 Object.freeze 方法来实现。我已经创建了一个演示 https://stackblitz.com/edit/react-wfhq4c 请查看 mozilla 开发网站。

你也可以参考https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze

您可以在 myService 中创建私有函数。还在 myservice 中创建一个默认函数 pub 并从此默认函数调用 doSomething

然后在另一个文件中,当您调用 myService 时,它​​将仅允许访问默认函数

let myService = {}
myService.doSomething = function() {
  console.log('Test');
  return 'myservice doSomething executed'
};
export function pub() {
  return myService.doSomething()
}


import * as test from './myService'
console.log(test.pub());

请检查此 DEMO

的控制台