Skip to content

踩坑记录

npmstudy edited this page Dec 13, 2023 · 1 revision

Object.assign

export class Proxy extends Plugable implements Strategy {
  public inject;

  constructor(cfg?: any) {
    super(Object.assign(ProxyDefaultConfig, cfg));
    //this.app.use(this.compose([this.before(), this.mount(), this.default()]));
  }
}

这段代码看着没问题的。如果cfg层级多于1层,就会报错,配置不生效。

image

Object.assign()拷贝的是属性值。假如源对象的属性值是一个对象的引用,那么它也只指向那个引用。也就是说,如果对象的属性值为简单类型(如string, number),通过Object.assign({},srcObj);得到的新对象为深拷贝;如果属性值为对象或其它引用类型,那对于这个对象而言其实是浅拷贝的。

最简单的做法是用lodash的merge。当然也可以自己写一个深拷贝

/**
 * Simple object check.
 * @param item
 * @returns {boolean}
 */
export function isObject(item) {
  return item && typeof item === 'object' && !Array.isArray(item);
}

/**
 * Deep merge two objects.
 * @param target
 * @param ...sources
 */
export function mergeDeep(target, ...sources) {
  if (!sources.length) return target;
  const source = sources.shift();

  if (isObject(target) && isObject(source)) {
    for (const key in source) {
      if (isObject(source[key])) {
        if (!target[key]) Object.assign(target, { [key]: {} });
        mergeDeep(target[key], source[key]);
      } else {
        Object.assign(target, { [key]: source[key] });
      }
    }
  }

  return mergeDeep(target, ...sources);
}
Clone this wiki locally