如何在 JavaScript 中实现用于设置和获取选项的非 CQS API

How to implement a Non-CQS API in JavaScript for setting and getting options

本文关键字:选项 获取 API CQS 设置 JavaScript 用于 实现      更新时间:2023-09-26

我正在开发一个提供一些配置选项的库。简化,想象一下:

let library() {
  let options = {
    optA: 'optA',
    optB: 'optB'
  };
  return {
    //Public API
    stuff1: ...,
    stuff2: ...
  };
};

这个库是这样使用的:

let libInstance = library();
libInstance.stuff1(...);
//Do stuff
libInstance.stuff2(...);
//Do more stuff

但我的想法是,您还可以更改库的配置选项。这将是这样:

libInstance.optA('new value for optA');
let optBValue = libInstance.optB();
console.log(optBValue);
//prints "optB"

因此,如果您将选项的名称作为方法调用,则它用作 setter 或 getter,具体取决于调用是带参数还是不带参数。我的问题是有很多选项,我认为必须有可能实现这一点,而无需在公共 API 中为每个选项定义一种方法,特别是因为所有这些方法都具有非常相似的行为。

然后,我想要的是,当您在我的库中调用一个未定义的函数时,它会检查是否有带有该函数名称的选项,如果存在,则调用相关的 setter 或 getter。只有在函数与任何选项都不匹配的情况下,才会引发异常。

这可能吗?如何?谢谢。

我一直

在调查,我认为不可能完全按照我的意愿去做(当你在我的库中调用一个未定义的函数时,它会检查是否有一个带有函数名称的选项,如果存在,则调用相关的 setter 或 getter)。

相反,我创建了这个帮助程序方法来生成默认访问器:

var generateAccessors = function generateAccessors(obj, api, exceptions) {
  for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
      if (exceptions.indexOf(key) < 0 && !api[key]) {
        api[key] = function accessor(newValue) {
          if (arguments.length === 0) {
            return obj[key];
          } else {
            obj[key] = newValue;
            return api;
          }
        };
      }
    }
  }
};

obj是输入对象,api我们要在其中创建访问器的对象,exceptions一个数组,我们可以在其中列出帮助程序将忽略的键。此外,如果在 api 对象中定义了 key,它也将被忽略,因此,如果需要特殊访问器,请先在 api 对象中定义它,然后再调用此生成器。

关于accessor函数本身的一些评论:

  • 请注意,要确定访问器是作为 getter 还是二传手我们检查arguments长度。这让我们设置一个变量值undefined ,如果显式提供。
  • 另请注意,如果访问器作为 setter 调用,它将返回api对象。这提供了方法链接功能。

作为那一刻,我会将其标记为解决方案,但如果有人知道更好的解决方案,我将很高兴阅读它。