javascript - 实现可设置模块作用域变量的最常见模式

标签 javascript design-patterns ecmascript-6 module

我正在编写一个客户端来与 JavaScript 中的服务器 API 进行对话。我有 OOP 背景,但正在尝试接受现代 EcmaScript。

所以我从这个开始:

customerApi.js:

const baseUrl = "http://myapi";
export const getCustomers = () => { /* get customer code */ }
export const addCustomer = cust => {}
export const deleteCustomer = id => {}

所有函数都使用baseUrl。

现在我想重构,以便使用 customerApi.js 的代码在 baseUrl 中设置/传递,而我想出的唯一方法是 -

将其设置为一个类:

export default class customerApi {
  constructor(baseUrl) {
   this._baseUrl  baseUrl;
  }
}

将其传递到每个方法中:

export const getCustomers = (baseUrl) => { /* get customer code */ }
export const addCustomer = (baseUrl,cust) => {}
export const deleteCustomer = (baseUrl,id) => {}

封装在函数中:

const moduleFn = baseUrl => (
  return {
    getCustomers: () => { /* get customer code */ }
    addCustomer: (cust) => {}
    deleteCustomer: (id) => {}
  }
)
export default moduleFn;

这些只是示例。 在模块上实现“可设置”变量的最常见模式是什么?

最佳答案

我会采用函数方法

export default function(baseUrl){

  return Object.freeze({
    getCustomers: () => { /* get customer code */ }
    addCustomer: (cust) => {}
    deleteCustomer: (id) => {}
  })

}

这是因为所有函数都在 baseUrl 上闭包,不需要额外的工作。

客户端代码可以简单地

import yourmodule from 'yourmodule';
var derp = yourmodule('www.derp.com')

关于javascript - 实现可设置模块作用域变量的最常见模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55387391/

相关文章:

javascript - 使用vuetifyJS数据表动态建表

java - java中装饰器和状态模式的结合——关于OO设计的问题

c# - 面向对象设计/设计模式场景

javascript - import * vs import { specificName } 在 Typescript/ES6 中?

javascript - 如何无限次淡出和淡入数组的值?

javascript - 如何编写从 JavaScript 数组中查找字段匹配的 MongoDB 查询

Javascript 继承重写

asp.net-mvc - ASP.NET MVC - 异常抛出?

javascript - 对象数组,按父对象分组

javascript - 函数返回未定义、预期的 Promise 或值异步方法