Page 152 - 你不知道的JavaScript(上卷)
P. 152
for (var key in sourceObj) {
// 只会在不存在的情况下复制
if (!(key in targetObj)) {
targetObj[key] = sourceObj[key];
}
}
return targetObj;
}
现在我们来分析一下 mixin(..) 的工作原理。它会遍历 sourceObj(本例中是 Vehicle)的
属性,如果在 targetObj(本例中是 Car)没有这个属性就会进行复制。由于我们是在目标
对象初始化之后才进行复制,因此一定要小心不要覆盖目标对象的原有属性。
如果我们是先进行复制然后对 Car 进行特殊化的话,就可以跳过存在性检查。不过这种方
法并不好用并且效率更低,所以不如第一种方法常用:
// 另一种混入函数,可能有重写风险
function mixin( sourceObj, targetObj ) {
for (var key in sourceObj) {
targetObj[key] = sourceObj[key];
}
return targetObj;
}
var Vehicle = {
// ...
};
// 首先创建一个空对象并把 Vehicle 的内容复制进去
var Car = mixin( Vehicle, { } );
// 然后把新内容复制到 Car 中
mixin( {
wheels: 4,
drive: function() {
// ...
}
}, Car );
这两种方法都可以把不重叠的内容从 Vehicle 中显性复制到 Car 中。“混入”这个名字来源
于这个过程的另一种解释:Car 中混合了 Vehicle 的内容,就像你把巧克力片混合到你最
喜欢的饼干面团中一样。
复制操作完成后,Car 就和 Vehicle 分离了,向 Car 中添加属性不会影响 Vehicle,反之
亦然。
混合对象“类” | 137