本节书摘来自异步社区《JavaScript框架设计》一书中的第1章,第1.2节,作者:司徒正美著,更多章节内容可以访问云栖社区“异步社区”公众号查看
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;
}