mix

Module

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

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

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

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

supplier 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 }

默认选项机制

常用于组件配置,不过推荐用 base 替代

var defaults = { validate: false, limit: 5, name: "foo" };
var options = { validate: true, name: "bar" };

/* merge defaults and options, without modifying defaults */
var settings = S.merge(defaults, options);

S.log(settings); // => { validate: true, limit: 5, name: bar }

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