javascript - 如何克隆一个函数
问题描述
我正在尝试实现克隆功能,但我不确定在尝试克隆时是否正确'[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] } ] } ] }
解决方案
您无法克隆箭头函数,当您克隆具有箭头函数作为属性的对象时,它们将始终绑定到创建它们的对象,您无法重新绑定它们,这就是箭头函数的全部意义,可预测的行为这个对象。如果要克隆对象,请确保引用 this 的任何函数都是普通函数而不是箭头函数。
推荐阅读
- email - 使用 ansible 从邮箱下载电子邮件附件
- pandas - 将熊猫数据框转换为火花数据框时转换列类型
- azure - Azure linux VM (RHEL) 磁盘未附加,错误 disk01' 大小为 '256' GB 无效
- c# - C# webapi httpget 数据表
- vue.js - 在 Vuex 中更新数组(状态)中对象值的最佳方法
- java - 扫描器在 For 循环期间未完成
- ios - 在 Swift 中搜索 tableview 数据并处理行选择
- azure-cosmosdb - 参数化查询 - 可以使用 GeoJson 对象值吗?
- php - Laravel Elequent 中复杂的旧 php MySQL 查询
- php - 特定远程 mysql 查询上的 PHP IIS 500.0