首页 > 解决方案 > 是否可以省略工厂函数中的属性?

问题描述

我想知道是否可以避免在工厂函数中定义属性。我尝试使用解构参数

让我更好地解释一下自己。假设我们有以下工厂函数:

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...')
    }
  })

可能吗?

标签: javascriptjavascript-objectsfactory-patterndestructuring

解决方案


如果将参数转换为对象,则可以这样做:

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: ƒ}

推荐阅读