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
的控制台
我正在使用以下方法在我的应用程序中创建类似单例的服务:
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
的控制台