首页 > 解决方案 > 如何克隆一个函数

问题描述

我正在尝试实现克隆功能,但我不确定在尝试克隆时是否正确'[object Function]'。您将在底部看到结果。我不确定所需的结果是否应该看起来像原始输入数据。让我知道您的想法以及您对如何实施它有任何想法。这是代码。

UPD:实际上它按预期工作。我将把它留在这里,以便人们在有相同问题时可以使用它。

function deep(value) {
  if (typeof value !== 'object' || value === null) {
    return value;
  }

  if (Array.isArray(value)) {
    return deepArray(value);
  }

  return deepObject(value);
}

function deepObject(source) {
  const result = {};

  Object.keys(source).forEach(key => {
    const value = source[key];

    result[key] = deep(value);
  });

  return result;
}

function deepArray(collection) {
  return collection.map(value => {
    return deep(value);
  });
}

const id1 = Symbol('id');
const value = {
  a: 2,
  f: id1,
  b: '2',
  c: false,
  g: [
    { a: { j: undefined }, func: () => {} },
    { a: 2, b: '2', c: false, g: [{ a: { j: undefined }, func: () => {} }] }
  ]
};

结果

{ a: 2,
  f: Symbol(id),
  b: '2',
  c: false,
  g:
   [ { a: { j: undefined }, func: [Function: func] },
     { a: 2,
       b: '2',
       c: false,
       g: [ { a: { j: undefined }, func: [Function: func] } ] } ] }

标签: javascript

解决方案


您无法克隆箭头函数,当您克隆具有箭头函数作为属性的对象时,它们将始终绑定到创建它们的对象,您无法重新绑定它们,这就是箭头函数的全部意义,可预测的行为这个对象。如果要克隆对象,请确保引用 this 的任何函数都是普通函数而不是箭头函数。


推荐阅读