javascript - 是否可以省略工厂函数中的属性?
问题描述
我想知道是否可以避免在工厂函数中定义属性。我尝试使用解构和参数。
让我更好地解释一下自己。假设我们有以下工厂函数:
const create_game = (name, artist, release) =>
({
name,
artist,
release,
load() {
console.log('Loading game...')
}
})
我已经使用了一种解构技术,称为属性值简写,因此我不必重复自己的属性分配。
name: name,
我的问题是我是否可以进一步做一些类似的魔法:
const create_game = (name, artist, release) =>
({
...args,
load() {
console.log('Loading game...')
}
})
可能吗?
解决方案
如果将参数转换为对象,则可以这样做:
const create_game = attributes =>
({
...attributes,
load() {
console.log('Loading game...')
}
})
create_game({ name: '...', artist: '...', release: '...' })
否则,如果您希望您的代码的未来读者摸不着头脑,您可以使用此 hack获取函数参数名称并施展魔法。看看这个怪物:
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
var ARGUMENT_NAMES = /([^\s,]+)/g;
function getParamNames(func) {
var fnStr = func.toString().replace(STRIP_COMMENTS, '');
var result = fnStr.slice(fnStr.indexOf('(')+1, fnStr.indexOf(')')).match(ARGUMENT_NAMES);
if(result === null)
result = [];
return result;
}
function create_game (name, artist, release) {
const _arguments = arguments
const argumentNames = getParamNames(create_game)
const argsObject = argumentNames.reduce(
(acc, argName, index) => ({ ...acc, [argName]: _arguments[index] }), {})
return ({
...argsObject,
load() {
console.log('Loading game...')
}
})
}
create_game('asdf', 'qwer', 'uiop')
// => {name: "asdf", artist: "qwer", release: "uiop", load: ƒ}
推荐阅读
- image-processing - 如何使用带有透明图像的 imageSearch?
- tensorflow - 在更新批量规范移动平均值之前在 tensorflow 中实现批量规范化,其中图形运行多次
- python - Pandas:如何通过拆分从一个多索引级别向多索引添加一个级别?
- python - 神经网络中具有不同样本大小的多个输入
- matlab - 在 Matlab 中校正照片
- javascript - 关于 Chrome 和 Firefox 中 Console.log 的问题
- json - 如何在http-server中以json格式显示日志
- python - FlaskRestPlus 如何在 url 中有一个可选参数
- testng - 得到 UnrecognizedPropertyException: Unrecognized field "noNamespaceSchemaLocation" during run "allure serve {projectpath}\target\surefire-reports"
- ios - 用于音频测量的 Swift AVFoundation 计时信息