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
   147   148   149   150   151   152   153   154   155   156   157