【问题标题】:How to anonymize a function / remove its name in an object?如何匿名化函数/删除对象中的名称?
【发布时间】:2016-07-12 22:09:38
【问题描述】:

我正在将函数从一个对象复制到另一个对象。问题是,虽然它们在源对象中是匿名的,但它们在目标对象中有一个名称:

var o1 = {
  a: function() {
    alert("Hello World");
  },
  b: 123,
  c: "Some string"
}

var o2 = {};

for (var key in o1) {
  if ("function" == typeof o1[key]) {
    o2[key] = o1[key];
  }
}

console.log(o2.a); //output: function o1.a()

这两个功能似乎并没有以某种方式联系起来,但这至少很烦人。此外,如果我在控制台中登录并单击名称,Firefox 开发者版就会知道该函数的来源。而且我不知道这是否会以某种方式产生其他不良影响。

所以,如果可以复制一个函数并使其保持匿名,那就太好了!

【问题讨论】:

  • 这在函数内部更进一步。比如说,上面的这段代码被包裹在一个函数foo中,那么控制台输出就是function foo/o1.a()
  • 我刚刚在 Chrome 和 Firefox 中进行了测试。当您将其放在另一个对象中时,这两个版本都不会向该函数添加名称。它总是知道源函数在哪里,因为你不是在复制它,而是在创建一个引用。无论如何,您为什么要保持匿名?
  • 引用复制...
  • @epascarello 如果你想学究气 ;) 关键是它们指的是相同的确切功能。
  • 您将删除o1.as 对函数的引用,而不是函数本身。您可以使用o1.a === o2.a // => true 测试它们是否具有相同的功能。

标签: javascript function object reference copy


【解决方案1】:

你可以使用Object.assign()

var o1 = {
  a: function() {
    alert("Hello World");
  },
  b: 123,
  c: "Some string"
}

var o2 = Object.assign({}, o1);

用于操作独立对象。

也看这个: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

【讨论】:

  • 你并不是真的在复制,你只是在复制参考。如果你这样做,那么o1.a === o2.a。他可能需要使用 Function.bind(o2)。
  • 嗯,这是“复制”对象的正确方法(作为 for-in-loop 的替代方法),但结果是一样的。
猜你喜欢
  • 2012-04-27
  • 2017-03-23
  • 1970-01-01
  • 2012-04-18
  • 2022-07-11
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
相关资源
最近更新 更多