最近在看《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

解决方案 »

  1.   

    extend 功能,第2个,第3个....参数的对象属性,扩展到第1个参数上我看了下也有疑问, for(var p in { toString:null}) 有什么情况,什么理由不成立?,这是他原文?
    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"];
    }());
      

  2.   

    改上1楼的
    for(var i=1;i < arguments.length; i++ ){ //从第二参数开始循环
      

  3.   


    这是for in,不是if. 
      

  4.   

       for(var p in { toString:null}){ //在这里就是相当于 if
           return function extend(o){ //只要为真就  return 退出整个 函数
    ..........
       ////我认为后面的没用  
       return function patched_extend(o){  //只要上面 for(var p in { toString:null}) 能进入,这下面的都没用
      

  5.   

    这段代码只所以那么写主要是为了兼容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"];
    }());
      

  6.   

      for(var p in { toString:null}){ // 没错是个遍历对象属性集合
        return function extend(o){ //你想想看上一句能条件进入到这,不是直接退出? 
    所以我觉得这函数写日的莫名其妙
    他文章后有解释,说明?
      

  7.   

    应该是兼容IE,不过我在IE7下也可以  for(var p in { toString:null}){