以文本形式获取对象的代码
由于一些奇怪的需求,尝试把一个对象的一个函数转换成具体代码,但同时又需要去覆写这个对象,于是乎在不断的尝试下有了以下两个主要的函数。
1.getFunctionCode
函数,用于得到function的具体代码
首先,我们需要编写一个函数 getFunctionCode
,该函数接受两个参数 obj
和 key
,用于获取对象中特定键对应的函数的源代码。函数首先检查对象中指定键对应的值是否为函数类型,如果是函数,则将函数的源代码以字符串形式返回,并对字符串中的特殊字符进行替换,例如将 &
替换为 =
,<
替换为 <
,>
替换为 >
。
const getFunctionCode = (obj, key) => {
if (typeof obj[key] != 'function')
return ''
return obj[key].toString().replace('&', '=').replace('<', '<').replace('>', '>')
}
这里的关键是函数的toString会得到函数的代码(至于是为什么…得益于js动态灵活的特性?
2.getObjectCode
函数,用于得到对象的代码
然后,我们需要编写一个函数 getObjectCode
,该函数接受一个对象 obj
和一个布尔值 newline
,用于将对象转换成文本形式的字符串输出。函数会遍历对象的所有属性,并根据属性的类型进行不同的处理。对于数字、布尔值和未定义的属性,将直接将属性名和属性值拼接成字符串;对于函数类型的属性,将调用 getFunctionCode
函数获取函数的源代码;对于字符串类型的属性,将将属性名和带有引号的属性值拼接成字符串;对于对象类型的属性,将递归调用自身处理嵌套对象。最后,将处理后的属性拼接成一个对象字面量的字符串,并返回。
const getObjectCode = (obj, newline = true) => {
let str = []
str.push('{')
for (let key of Object.keys(obj)) {
switch (typeof obj[key]) {
case 'number':
case 'boolean':
case 'undefined':
str.push(`${key}:${obj[key]}`)
break;
case 'function':
str.push(`${key}:${getFunctionCode(obj,key)}`)
break;
case 'string':
str.push(`${key}:'${obj[key]}'`)
break;
case 'object':
str.push(`${key}:${getObjectCode(obj[key])}`)
break;
default:
break;
}
}
str.push('}')
return str.join(newline ? '\n' : '')
}
3. 创建示例对象
接下来,我们创建一个示例对象 x
,该对象包含了一个名为 func
的箭头函数以及其他一些属性。
const x = {
func: (a, b) => {
return a + b;
},
yy: 1,
y2: 'hello',
y3: true,
dd: {
xx: 1,
yyy: '77'
}
};
4. 结果输出
最后,我们调用 getObjectCode
函数,并将示例对象 x
作为参数传入.
5. 其他
使用x.func = eval('(a,b)=>{return a+2;}')
会让x的func被覆写,以文本形式。