一段JavaScript代码,求高手解惑
最近在看《JavaScript权威指南 第6版》这本书,今天在书上看到这样一段代码,看不懂,虽然书上有写大概干些什么,但是具体到每一句代码我就不知道它的思路了,希望各路高手大神能够帮我加点注释,便于我理解,先谢谢大家了.这本书我不是从开头开始看的,不知道是不是要把前面的几章先看了。
javascript
var extend=(function(){
for(var p in { toString:null}){
return function extend(o){
for(var i=1;i < arguments.length; i++ ){
var source = arguements[i];
for (var prop in source ) o[prop] = source[prop];
}
return o;
};
}
return function patched_extend(o){
for(var i = 1;i < arguments.length; i++){
var source = arguments[i];
for(var prop in source) o[prop] = source[prop];
for(var j = 0; j < protoprops.length;j++){
prop = protoprops[j];
if(source.hasOwnProperty(prop)) o[prop] = source[prop];
}
}
return o;
};
var protoprops = ["toString","valueOf","constructor","hasOwnProperty",
"isPrototypeOf","propertyIsEnumerable","toLocaleString"];
}());
for(var prop in source) o[prop] = source[prop];
for(var j = 0; j < protoprops.length;j++){
prop = protoprops[j];
if(source.hasOwnProperty(prop)) o[prop] = source[prop];
}
}
return o;
};
var protoprops = ["toString","valueOf","constructor","hasOwnProperty",
"isPrototypeOf","propertyIsEnumerable","toLocaleString"];
}());
[解决办法]
这段代码只所以那么写主要是为了兼容IE。IE下有个Bug,toStrin、valueOf等从Object
对象继承的方法是不能通过for in 的方式被列举的。但对于Firefox等标准浏览器来说,
如果这些方法被重写了就可以被列举,否则不能。你可以用下面的代码检验下:
for(var i in {toString: null}){
alert(i); //非IE下将有输出
}
所以上面那段代码可以这样理解
var extend=(function(){
//for firefox、chrome
for(var p in { toString:null}){
return function extend(o){
for(var i=1;i < arguments.length; i++ ){
var source = arguements[i];
for (var prop in source ) o[prop] = source[prop];
}
return o;
};
}
//for ie.通过名字也可以猜到这是在为IE打补丁
return function patched_extend(o){
for(var i = 1;i < arguments.length; i++){
var source = arguments[i];
for(var prop in source) o[prop] = source[prop];
for(var j = 0; j < protoprops.length;j++){
prop = protoprops[j];
if(source.hasOwnProperty(prop)) o[prop] = source[prop];
}
}
return o;
};
var protoprops = ["toString","valueOf","constructor","hasOwnProperty",
"isPrototypeOf","propertyIsEnumerable","toLocaleString"];
}());