当前位置:  开发笔记 > 编程语言 > 正文

在Internet Explorer中实现Mozilla的toSource()方法

如何解决《在InternetExplorer中实现Mozilla的toSource()方法》经验,为你挑选了3个好方法。

有没有人为Internet Explorer和其他非Gecko浏览器实现Mozilla的Object.toSource()方法?我正在寻找一种将简单对象序列化为字符串的轻量级方法.



1> Ekim..:

请考虑以下事项:(使用FireFox 3.6时)

javascript:
  x=function(){alert('caveat compter')};
  alert(['JSON:\t',JSON.stringify(x),'\n\ntoSource():\t',x.toSource()].join(''));

显示:

JSON:

toSource():( function(){alert("caveat compter");})

甚至:

javascript:
x=[];x[3]=x;
alert('toSource():\t'+x.toSource());
alert('JSON can not handle this at all and goes "infinite".');
alert('JSON:\n'+JSON.stringify(x));

显示:

toSource():#1 = [,,,#1#]

并且"go'无限'"消息跟随JSON的stackoverflow递归离题.

这些示例强调了由toSource()呈现的JSON表示中明确排除的表达式的微妙之处.

对于所有情况,组合程序来复制相同的结果并不容易,因为Gecko toSource()原语非常强大.

下面是一些复制到Source()功能的程序必须成功处理的"移动目标":

javascript:
function render(title,src){ (function(objRA){
    alert([ title, src,
        '\ntoSource():',objRA.toSource(),
        '\nJSON:',JSON.stringify(objRA)     ].join('\n'));
    })(eval(src));
}
render('Simple Raw Object source code:',
    '[new Array, new Object, new Number, new String, ' +
        'new Boolean, new Date, new RegExp, new Function]'  );

render( 'Literal Instances source code:',
    '[ [], 1, true, {}, "", /./, new Date(), function(){} ]'    );

render( 'some predefined entities:',
    '[JSON, Math, null, Infinity, NaN, ' +
        'void(0), Function, Array, Object, undefined]'      );

显示:

    Simple Raw Object source code:
    [new Array, new Object, new Number, new String, 
                new Boolean, new Date, new RegExp, new Function]

    toSource():
    [[], {}, (new Number(0)), (new String("")), 
                (new Boolean(false)), (new Date(1302637995772)), /(?:)/, 
                            (function anonymous() {})]

    JSON:
    [[],{},0,"",false,"2011-04-12T19:53:15.772Z",{},null]

然后显示:

    Literal Instances source code: 
    [ [], 1, true, {}, "", /./, new Date(), function(){} ]

    toSource():  
    [[], 1, true, {}, "", /./, (new Date(1302638514097)), (function () {})]

    JSON:  
    [[],1,true,{},"",{},"2011-04-12T20:01:54.097Z",null]

最后:

    some predefined entities:
    [JSON, Math, null, Infinity, NaN, void(0), 
                        Function, Array, Object, undefined]

    toSource():
    [JSON, Math, null, Infinity, NaN, (void 0), 
        function Function() {[native code]}, function Array() {[native code]}, 
            function Object() {[native code]}, (void 0)]

    JSON:
    [{},{},null,null,null,null,null,null,null,null]

如果需要简单的良性人类消费以查看对象的内部结构,那么如果翻译是"要使用"或不那么严格,则之前的分析是重要的.作为表示,主要JSON功能是在环境之间传输一些"要使用"的结构化信息.

toSource()函数的质量是影响但不限于:
往返计算,最小不动点属性和反函数的程序的指称语义中的一个因素.

重复的代码转换是否静止到静态?

obj.toSource()== eval(eval(eval(obj.toSource()).toSource()).toSource()).toSource()?

考虑obj == eval(obj.toSource())是否有意义?

是否撤消转换结果,而不仅仅是类似的对象,而是IDENTICAL?
这是一个加载的问题,在克隆操作对象时会产生深远的影响.

还有很多......

请注意,当obj包含已执行的代码对象时,上述问题具有更多意义,例如(new Function ...)()!



2> Ates Goral..:

如果匹配Firefox的确切序列化格式不是您的目标,您可以使用http://json.org上列出的JavaScript JSON序列化/反序列化库之一.使用像JSON这样的标准方案可能比模仿专有的Gecko格式更好.



3> Daniel Lewis..:

如果需要使用循环引用序列化对象,可以使用https://github.com/douglascrockford/JSON-js上的 Douglas Crockford对JSON对象的cycle.js扩展.这非常类似于Source(),虽然它不会序列化函数(但可能适用于使用函数的toString方法).

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有