最近在看《JavaScript权威指南 第6版》这本书,今天在书上看到这样一段代码,看不懂,虽然书上有写大概干些什么,但是具体到每一句代码我就不知道它的思路了,希望各路高手大神能够帮我加点注释,便于我理解,先谢谢大家了.这本书我不是从开头开始看的,不知道是不是要把前面的几章先看了。
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"];
}());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"];
}());javascript
var extend=(function(){
for(var p in { toString:null}){ //我认为是永真, 我还真不知道为什么要这么写
return function extend(o){ //其实返回extend就是这一个函数
for(var i=1;i < arguments.length; i++ ){ //从第一参数开始循环
var source = arguements[i];
for (var prop in source ) o[prop] = source[prop]; //把第 i 个参数上的属性拷贝到时 第一个参数上
}
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 i=1;i < arguments.length; i++ ){ //从第二参数开始循环
这是for in,不是if.
return function extend(o){ //只要为真就 return 退出整个 函数
..........
////我认为后面的没用
return function patched_extend(o){ //只要上面 for(var p in { toString:null}) 能进入,这下面的都没用
对象继承的方法是不能通过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"];
}());
return function extend(o){ //你想想看上一句能条件进入到这,不是直接退出?
所以我觉得这函数写日的莫名其妙
他文章后有解释,说明?