深层混合代码“有效”,但我不知道为什么

时间:2019-07-14 17:56:23

标签: javascript node.js mixins

我写了这段代码,但是我不知道为什么会起作用。

const mixin = (a, b) => {

  for (const [key, val] of Object.entries(b)) {

    if (!(val && typeof val === 'object')) {
      a[key] = b[key];
      continue;
    }

    if (!a.hasOwnProperty(key)) {
      a[key] = b[key];
      continue;
    }

    if(!(a[key] && typeof a[key] === 'object')){
      a[key] = b[key];
      continue;
    }

    if (a[key] === b[key]) {
      continue;
    }


    mixin(a[key], b[key]);

  }

  return a;

};


const deepMixin = (...v) => {
  return v.reduce((a, b) => mixin(a, b), {});
};



const m1 = {
  bar: '1',
  foo() {
    return 'm1';
  }
};

const m2 = {
  bar: '2',
  foo() {
    return 'm2';
  }
};

m2.foo.bar = 2;


const m3 = {
  bar: '3',
  foo() {
    return 'm3';
  }
};

m3.foo.bar = 3;


console.log(deepMixin(m1, m2, m3).foo());  // m3
console.log(deepMixin(m1, m2, m3).foo.bar);  // 3

// works, but why

基本上,deepMixin的行为类似于Object.assign。有两个区别:

  1. deepMixin始终返回一个新对象(不可变)。
  2. 它遍历子属性,而不是仅在顶级道具上运行。

但是我不知道为什么打电话

console.log(deepMixin(m1, m2, m3).foo());  // m3

我的代码中没有任何内容可以看到将顶级foo属性从rhs(b)复制到lhs(a)对象。

有人知道为什么代码“有效”吗?

0 个答案:

没有答案