Javascript奇淫技巧:以文本形式输出对象的代码

本文详细阐述了如何用JavaScript编写getFunctionCode和getObjectCode函数,以转换对象及其函数为文本形式,包括对象属性的递归处理和覆写功能。
摘要由CSDN通过智能技术生成

以文本形式获取对象的代码

由于一些奇怪的需求,尝试把一个对象的一个函数转换成具体代码,但同时又需要去覆写这个对象,于是乎在不断的尝试下有了以下两个主要的函数。

1.getFunctionCode 函数,用于得到function的具体代码

首先,我们需要编写一个函数 getFunctionCode,该函数接受两个参数 objkey,用于获取对象中特定键对应的函数的源代码。函数首先检查对象中指定键对应的值是否为函数类型,如果是函数,则将函数的源代码以字符串形式返回,并对字符串中的特殊字符进行替换,例如将 &amp; 替换为 =&lt; 替换为 <&gt; 替换为 >

const getFunctionCode = (obj, key) => {
    if (typeof obj[key] != 'function')
        return ''
    return obj[key].toString().replace('&amp;', '=').replace('&lt;', '<').replace('&gt;', '>')
}

这里的关键是函数的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被覆写,以文本形式。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值