javascript - es6函数定义形参的时候使用对象解构写法, 函数外部能获取到形参结构对象的结构么?

查看:106
本文介绍了javascript - es6函数定义形参的时候使用对象解构写法, 函数外部能获取到形参结构对象的结构么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

存在一个对象

Obj = {
    Foo : ({prop_1, prop_2}) => {
    ...
    },
    ...
}

我们需要建立一个这个对象的结构描述, 需要记录下 Obj 对象拥有的所有成员, 包括函数的参数结构.

假设传入一个未知的 ObjInstance, 这个对象实例拥有一个成员(原型)函数 Foo, 需要解析出这个形参的结构, 即获取到['prop_1', 'prop_2']这个列表.

现在已知的是可以获取到形参的长度. 且无法获取形参名, 因为形参名实际是允许被混淆的.

约定所有函数定义都以对象形式传参. 结构方式定义形参的话对象结构是不会被混淆.

各位英雄豪杰有无妙解?

解决方案

模拟了一下 Angular 依赖注入,供参考

function getArgs (fn) {
  if (typeof fn !== 'function') { return [] }

  var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg
  var DECON_PROPS = /^(?:function.*)?\(.*\{\s*([^}]*)\}.*\)/m
  var args = (fn.toString().replace(STRIP_COMMENTS, '').match(DECON_PROPS) || [, ''])[1]

  return args.split(',').map(arg => arg.split(':')[0].trim()).filter(arg => arg)
}

var obj = {
  Foo: ({ prop_1, prop_2 }, s) => {}
}

console.log(getArgs(function () {}))
console.log(getArgs(function a ({p1, p2}) {}))
console.log(getArgs(function a ({p1,
  p2}) {}))
console.log(getArgs(function a ({ p1, p2 }) {}))
console.log(getArgs(function ({p1, p2}) {}))
console.log(getArgs(function ({p1, p2}, p3) {}))
console.log(getArgs(function (p0, {p1, p2}, p3) {}))
console.log(getArgs(() => {}))
console.log(getArgs(({p1, p2, p3}) => {}))
console.log(getArgs(({ p1, p2 }) => p2))
console.log(getArgs(p1 => p1))
console.log(getArgs(({p1}) => p1))
console.log(getArgs(obj.Foo))

这篇关于javascript - es6函数定义形参的时候使用对象解构写法, 函数外部能获取到形参结构对象的结构么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆