JavaScript框架设计
上QQ阅读APP看书,第一时间看更新

1.2 对象扩展

我们需要一种机制,将新功能添加到我们的命名空间上。这方法在JavaScript通常被称做extend或mixin。JavaScript对象在属性描述符(Property Descriptor)没有诞生之前,是可以随意添加、更改、删除其成员的,因此扩展一个对象非常便捷。一个简单的扩展方法实现是这样。

      function extend(destination, source) {
          for (var property in source)
              destination[property] = source[property];
          return destination;
      }

不过,旧版本IE在这里有个问题,它认为像Object的原型方法就是不应该被遍历出来,因此for in循环是无法遍历名为valueOf、toString的属性名。这导致,后来人们模拟Object.keys方法实现时也遇到了这个问题。

      Object.keys = Object.keys || function(obj){
          var a = [];
          for(a[a.length] in obj);
          return a ;
      }

在不同的框架,这个方法还有不同的实现,如EXT分为apply与applyIf两个方法,前者会覆盖目标对象的同名属性,而后者不会。dojo允许多个对象合并在一起。jQuery还支持深拷贝。下面是mass Framework的mix方法,支持多对象合并与选择是否覆写。

      function mix(target, source) {           //如果最后参数是布尔,判定是否覆写同名属性
          var args = [].slice.call(arguments), i = 1, key,
                  ride = typeof args[args.length - 1] == "boolean" ? args.pop() : true;
          if (args.length === 1) {              //处理$.mix(hash)的情形
              target = !this.window ? this : {};
              i = 0;
          }
          while ((source = args[i++])) {
              for (key in source) {              //允许对象糅杂,用户保证都是对象
                  if (ride || !(key in target)) {
                      target[ key ] = source[ key ];
                  }
              }
          }
          return target;
      }