mix

Methods

KISSY.mix()
Object KISSY.mix (receiver , supplier [ , overwrite = true , whitelist , deep ])
将 supplier 对象的成员复制到 receiver 对象上.
Parameters:
  • receiver (object) – 属性接受者对象.
  • supplier (object) – 属性来源对象.
  • overwrite (boolean) – 是否覆盖接受者同名属性.
  • whitelist (Array<string>) – 属性来源对象的属性白名单, 仅在名单中的属性进行复制.
  • deep (boolean) – 是否进行深度 mix (deep copy)
Returns:

receiver 属性接受者对象.

Return type:

object

Note

receiver 会被改变,如果想要保留原始的 receiver ,可以使用 KISSY.merge()

var object=S.merge(object1,object2);

S.mix 默认不是递归进行的. 如果其中一个属性为对象或者数组,那么他将会被接下来对象的同名属性对应的值所代替,即值不会被合并。 如果设置了参数 deep = true ,那么会对数组和简单对象( KISSY.isPlainObject() )递归合并.

supplier undefined 的属性值不会被复制,不过对象从原型继承下来下的值则会被复制.

Note

该方法仅适用于 javascript 对象,不要再浏览器对象上调用,例如 node.style

Note

mix 支持函数作为白名单参数

var a = {},
b = {
    b1: 1,
    b2: {
        b2: 22
    }
};

S.mix(a, b, {
    deep: true,
    whitelist: function (name, v) {
        if (name == 'b1') {
            return v;
        }
        if (this.b1 && name == 'b2') {
            return v;
        }
        return undefined;
    }
});

简单 mix

var S = KISSY,
r = { a: 'a', b: 'b' };

S.mix(r, { c: 'c' });
S.log(r.c); // => 'c'

S.mix(r, { a: 'a2' }, false);
S.log(r.a); // => 'a'

S.mix(r, { e: 'e', f: 'f' }, true, ['f']);
S.log(r.e); // => undefined
S.log(r.f); // => 'f'

深度 mix

var object1 = {
  apple: 0,
  banana: {weight: 52, price: 100},
  cherry: 97
};
var object2 = {
  banana: {price: 200},
  durian: 100
};

/* merge object2 into object1, recursively */
S.mix(object1,object2,undefined,undefined,true);

S.log(object1); // => { apple: 0, banana: { weight: 52, price: 200 }, cherry: 97, durian: 100 }

该方法在 KISSY 里具有非常重要的地位. JavaScript 是一门动态语言, 利用 mixin 特性, 可以很方便的实现特性的静态复制和动态修改.