javascript - es6函数定义形参的时候使用对象解构写法, 函数外部能获取到形参结构对象的结构么?
本文介绍了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屋!
查看全文