上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; }