【问题标题】:Is there a pure functional equivalent to goog.object.extend?是否有与 goog.object.extend 等效的纯功能?
【发布时间】:2015-04-07 21:18:07
【问题描述】:

Closure documentation:

用另一个对象扩展一个对象。这“就地”运行;它不会创建新对象。示例:var o = {}; goog.object.extend(o, {a: 0, b: 1}); ○; // {a: 0, b: 1} goog.object.extend(o, {b: 2, c: 3}); ○; // {a: 0, b: 2, c: 3}

但这不是一种功能性方法,并且在许多情况下,功能性方法更好。 Closure 是否为此提供了更现代的东西?

例如

goog.object.extend(a, b);

变成

a = goog.object.extend(a, b);

【问题讨论】:

  • 你想写的代码是什么样的?

标签: javascript functional-programming google-closure-library


【解决方案1】:

您可以使用空对象字面量创建一个新对象,以使用您要复制合并的对象进行扩展:

var x = {};
goog.object.extend(x, a, b);
a = x;

如果您要扩展非普通对象,您可能需要使用Object.create(Object.getPrototypeOf(a))

【讨论】:

  • 这似乎不正确:goog.object.extend() 不返回第一个参数(就像 jQuery.extend 一样。
  • @Peeja:嗯,奇怪,这改变了吗?我一定以为它会起作用。
  • 我不确定,我只是尝试过。我认为它也会起作用。
【解决方案2】:

你可以自己实现它:

var a = {};
var b = extend(a, { a: 0, b: 1 });
var c = extend(b, { b: 2, c: 3 });

console.log(a, b, c);

function extend(a, b) {
    var result = {};
    for (var x in a) if (a.hasOwnProperty(x)) result[x] = a[x];
    for (var x in b) if (b.hasOwnProperty(x)) result[x] = b[x];
    return result;
}

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多