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

时间:2019-05-09 08:38:32

标签: javascript design-patterns ecmascript-6 service es6-modules

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

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};

这对于单例服务是不希望的,它应该是不变的。

如何实现不变性?是否有人有完全不同/更好的方法来将不可变服务创建为ES6模块?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

您可以在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

的控制台