6.1 枚举对象属性的工具函数

【TDG-读书笔记】6.1 枚举对象属性的工具函数

extend(o, p) 恶性合并,用p中的同名属性覆盖掉o中的同名属性
var p1 = { "name" : "Tom", "age" : 29 };
var p2 = { "name" : "July", "weight" : 110 };

// 恶性合并,即:存在同名属性时,覆盖掉o中的属性
function extend ( o, p ) {
    for ( var prop in p ) {
        // for-in 遍历对象属性
        o[prop] = p[prop];
    }

    // 返回合并后的对象
    return o;
}

var res = extend( p1, p2 );

console.log(p1);        // p1 被合并,内容发生改变
console.log(p2);        // p2 内容不变
console.log(res);   // p1 p2 合并后的结果,指向p1

// Output: 
test.html:57 Object {name: "July", age: 29, weight: 110}
test.html:58 Object {name: "July", weight: 110}
test.html:59 Object {name: "July", age: 29, weight: 110}
merge(o, p) 友好合并,保留o中的同名属性
// 友好合并,即:存在同名属性时,保留o中的属性,不进行覆盖
function merge ( o, p ) {
    for ( var prop in p ) {
        // for-in 遍历对象属性
        if ( o.hasOwnProperty( prop ) ) continue;
        o[prop] = p[prop];
    }

    // 返回合并后的对象
    return o;
}

var res = merge( p1, p2 );

console.log(p1);        // p1 被合并,内容发生改变
console.log(p2);        // p2 内容不变
console.log(res);   // p1 p2 合并后的结果,指向p1

// Output: 保留了原来的值
test.html:64 Object {name: "Tom", age: 29, weight: 110}
test.html:65 Object {name: "July", weight: 110}
test.html:66 Object {name: "Tom", age: 29, weight: 110}
restrict(o, p) 排除异己,从o中删除p中不存在的属性
// 排除异己,从o中删除掉p中不存在的属性,即:我无你也不能有,~~!
function restrict ( o, p ) {
    for ( var prop in o ) {
        // for-in 遍历对象属性
        // p中不存在,则将其从o中删除掉
        if ( ! ( prop in p) ) delete o[prop];
    }

    // 返回排除不同属性的对象
    return o;
}

var res = restrict( p1, p2 );

console.log(p1);        // p1 部分属性被删除,内容发生改变
console.log(p2);        // p2 内容不变
console.log(res);   // p1 p2 合并后的结果,指向p1

// Output: 我里面有name所以你可以有,但是age我这里没有,所以你也不能有
test.html:46 Object {name: "Tom"}
test.html:47 Object {name: "July", weight: 110}
test.html:48 Object {name: "Tom"}
substrict(o, p) 残杀同类,从o中删除p中存在的属性
// 残杀同类,从o中删除p中存在的属性,即:我能有但是你不允许有,~~!
function subtract ( o, p ) {
    for ( var prop in p) {
        // for-in 遍历对象属性
        // p中存在,且o中也有,则将其从o中删除掉
        delete o[prop];
    }

    // 返回已删除同名属性的的对象
    return o;
}

var res = subtrct( p1, p2 );

console.log(p1);        // p1 部分属性被删除,内容发生改变
console.log(p2);        // p2 内容不变
console.log(res);   // p1 p2 合并后的结果,指向p1

// Output: name在p1,p2中都存在,所以从p1中删除掉了
test.html:53 Object {age: 29}
test.html:54 Object {name: "July", weight: 110}
test.html:55 Object {age: 29}
union(o, p) 善意的谎言,合并对象属性,但保留p自身的同名属性,返回新对象
// 善意的谎言,合并对象,保留后者同名属性,即:我们合体吧,但是用我的外表和名字,嘎嘎嘎~~!
function union ( o, p ) {
    // 将o对象化,然后与p合并,并且用p中的同名属性覆盖掉o中的,如果存在。
    return extend( extend( {}, o ), p);
}

var res = union( p1, p2 );

console.log(p1);        // p1 内容不变
console.log(p2);        // p2 内容不变
console.log(res);   // p1 p2 合并后的返回的新对象

// Output: 同名的weight保留了p2中的值,p1,p2不变,返回的是个新对象
test.html:56 Object {name: "Tom", age: 29}
test.html:57 Object {name: "July", weight: 110}
test.html:58 Object {name: "July", age: 29, weight: 110}
intersection(o, p) 不求回报的付出,返回一个拥有o, p共有属性的新对象,保留o中的属性值
// 不求回报的付出,对象的交集,保留前者者同名属性,即:我要让你变成我一样,我是多么得伟大,多么的有爱心,呵呵呵~~!
function intersection ( o, p ) {
    // 将o对象化,然后从o中删除p中不存在的属性。
    return restrict( extend( {}, o ), p);
}

var res = intersection( p1, p2 );

console.log(p1);        // p1 内容不变
console.log(p2);        // p2 内容不变
console.log(res);   // p1 p2 排除异己之后剩下的共有属性组成的新对象

// Output: 保留了p1,p2中都存在的属性name, p1,p2不变,返回新对象
test.html:61 Object {name: "Tom", age: 29}
test.html:62 Object {name: "July", weight: 110}
test.html:63 Object {name: "Tom"}
keys(o) 返回一个数组,数组里包含了对象o里可以枚举的自有属性(非原型属性)
function keys( o ) {
    // 排除参数o不是对象的情况,抛出异常处理
    if ( typeof o !== "object" ) throw TypeError(); 
    var result = []; // 用来保存已查找出的可以枚举的属性

    for ( var prop in o ) {
        if ( o.hasOwnProperty( prop ) ) {
            result.push( prop );
        }
    }

    // 返回保存了可以枚举的属性的数组
    return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若叶岂知秋vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值