万恶的prototype

来源:互联网 发布:51单片机c语言教程全集 编辑:程序博客网 时间:2024/05/17 06:00



今天进行JS调试的时候,发现一个很奇怪的问题,本来运行好好的脚本,突然就异常了。于是try-catch了一下,抓出了异常。异常


内容如下:
TypeError: Object function (filter) {            return JSON.stringify(this, filter);        } has no method 


'replace'


奇怪了,怎么会有这个异常?我明明没有引用这个方法呀!蛋疼无比!


于是在Chrome中按F12果断开调试,跟来跟去,发现是一段将INI文件转换成JSON出错了。主要代码如下:
for(var section in iniTree)
   for (var key in iniTree[sectionName]) {
            var value = iniTree[sectionName][key].replace(/[\r\n]/, '');//异常出现的地方
   Config[sectionName][key] = value;
    }
}


出问题的地方是发现了,可这个是由于什么地方引起的呢?我想到,之前曾能引用过JSON.js,于是猜测会不会是JSON.js里改变了


object的原型链?


于是将异常中的return JSON.stringify(this, filter);拿来搜索,果然发现有一段改变object原型链的代码。其代码如下:
    if (!Object.prototype.toJSONString) {//The method will pollute object.
        Object.prototype.toJSONString = function (filter) {
            return JSON.stringify(this, filter);
        };
        Object.prototype.parseJSON = function (filter) {
            return JSON.parse(this, filter);
        };
    }


这里Object.prototype.toJSONString和Object.prototype.parseJSON 改变了object的原型链。而object是全局的,会影响到所有


的object。而我前面的iniTree就是了个object,所以立即将这段代码屏蔽掉,再运行,OK了。


问题解决了,回过头来想想,prototype原型链是挺好用的,但是链接到object时,一定要小心。尤其是在引用其他开源的库时,更


要格外小心,因为有的库是使用prototype的原型链来运作的,而这极有可能会影响到全局。


所以prototype好用是好用,但要慎用。
原创粉丝点击