如何在 JavaScript 中实现用于设置和获取选项的非 CQS API
How to implement a Non-CQS API in JavaScript for setting and getting options
我正在开发一个提供一些配置选项的库。简化,想象一下:
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
对象。这提供了方法链接功能。
作为那一刻,我会将其标记为解决方案,但如果有人知道更好的解决方案,我将很高兴阅读它。
相关文章:
- 使用Javascript获取所选选项ID
- 活动选项卡's源代码-获取变量s值
- 如何从选择框中的选项中获取属性值
- 正在获取所选选项数据
- Jquery:如何获取所选选项全文(带空格)
- 使用JavaScript在IE9中获取数据列表选项
- 如何在不需要单击按钮的情况下获取选项的值
- 如何在jquery.easytabs.js中获取当前选项卡
- AngularJS ng选项获取索引
- 在选择中从上一个选项获取数据,从当前选项获取数据
- 使用此值选择选项获取脚本
- 如何使用JavaScript将选中的选项获取为选择下拉标签
- 使用选择选项获取行平均值
- 从multiselect中的选定选项获取属性值
- 使用JQUERY通过文本选择选项获取值
- 从AngularJS中的选定选项获取值
- 我正在尝试使用表单选择选项获取当前日期,并在提交时显示接下来的七天
- 自动填充空值在ng模型中,从ng选项获取数据
- 验证下拉列表以根据所选选项获取正确的日期
- 如何从所选选项获取文本