我写了这段代码,但是我不知道为什么会起作用。
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
。有两个区别:
但是我不知道为什么打电话
console.log(deepMixin(m1, m2, m3).foo()); // m3
我的代码中没有任何内容可以看到将顶级foo属性从rhs(b)复制到lhs(a)对象。
有人知道为什么代码“有效”吗?