JavaScript:将对象名称作为字符串

时间:2013-07-26 07:54:21

标签: javascript dom

我在函数中尝试alert任何JavaScript对象作为字符串。这意味着如果给函数的参数是window.document,它是实际的对象,它应该将“window.document”(不带引号)警告为 literal 字符串。

以下电话......

example(window);
example(window.document);
example(document.getElementById('something'));

...调用此函数......

  

功能示例(o){/ *请稍微帮忙吗? * /}

...应输出以下字符串......

window
window.document
document.getElementById('something')

我试图用toString()eval()的组合在黑暗中进行一些更多的混合镜头而没有成功。

不需要疯狂的向后兼容性,新的ECMAScript / JavaScript功能/功能都可以。尽管目标应该非常直接,但请随意查询澄清。

3 个答案:

答案 0 :(得分:3)

在自包含脚本中无法做到这一点。

如果使用预处理器是一个选项,那么您可以编写一个将example(whatever)转换为example('whatever')的选项。除此之外,我担心你运气不好。

答案 1 :(得分:1)

第一个问题是对象没有名称。

第二个问题是,从您的示例中,您不是真的想要打印对象的(不存在的)名称,而是要打印评估为对象引用的表达式 。这就是你在这个例子中要做的事情:

example(document.getElementById('something'));

为了打印document.getElementById('something'),JavaScript必须将该表达式的实际文本保存在可供您使用的位置。但它没有那样做。它只是评估解析和编译的表达式,而不参考表达式的原始文本。

如果您愿意将论点引用到example(),那么当然这将是微不足道的:

example( "document.getElementById('something')" );

显然在这种情况下你可以直接打印字符串,或者eval()来获取表达式的结果。

OTOH,如果你想尝试真正的黑客攻击,这可以在一些非常有限的情况下使用:

function example( value ) {
    var code = arguments.callee.caller.toString();
    var match = code.match( /example\s*\(\s*(.*)\s*\)/ );
    console.log( match && match[1] );
}

function test() {
    var a = (1);
    example( document.getElementById('body') );
    var b = (2);
}

test();

这将打印您想要的内容:

document.getElementById('body')

a函数中对btest()的分配就是为了验证正则表达式没有占用太多代码。)

但是如果调用函数中有多个example()调用,或者该调用被分成多行,则会失败。此外,arguments.callee.caller已被弃用了一段时间,但只要您没有处于严格模式,大多数浏览器仍然支持{{1}}。我想这个hack可能对某些调试目的很有用。

答案 2 :(得分:0)

不知道为什么需要这个,但你可以尝试递归地遍历对象树并将其节点与你的参数进行比较:

function objectName(x) {

    function search(x, context, path) {
        if(x === context)
            return path;
        if(typeof context != "object" || seen.indexOf(context) >= 0)
            return;
        seen.push(context);
        for(var p in context) {
            var q = search(x, context[p], path + "." + p);
            if(q)
                return q;
        }
    }

    var seen = [];
    return search(x, window, "window");
}

示例:

console.log(objectName(document.body))

为我打印

window.document.activeElement