JS函数将对象作为输入,并返回一个对象,该对象对作为参数传递的对象执行操作

时间:2016-03-23 12:59:58

标签: javascript function object

我写了一个函数,它输入一个可以将值设置为键或直接分配对象的对象。 setter和getter工作正常,但是当对象被分配给另一个对象时,它不能很好地工作(对象根本不会改变)。

奇怪的是当对象输出"内部"结果正确的功能。但结果不是我所期望的那样"外面"功能。任何人都可以解释一下吗?

string(6) "Test 5"

3 个答案:

答案 0 :(得分:0)

此处:input = Object.assign({}, object),您要分配给新对象({}),因此您不会编辑最初传递的对象。 将此行更改为Object.assign(input, object)应该可以执行您想要的操作。

答案 1 :(得分:0)

问题是每次调用assign函数时都会创建新对象。要扩展输入对象,请使用Object.assign(input,object)而不是input = Object.assign({},object);

function foo(input) {
    return {
        set: function(key, value) {
            input[key] = value;
            console.log(input);
        },
        get: function(key) {
            return input[key];
        },
        assign: function(object) {
            Object.assign(input, object);
            console.log(input);
        }
    };
};

答案 2 :(得分:0)

var obj = {}

上面创建了一个对象(我们将其称为A)并将其引用分配给obj

bar = foo(obj);

现在,您将obj的值(即对A的引用)传递给foo

function foo(input)

...然后将其分配给input

现在你有两个变量(inputobj),它们的值都是对A的引用。

input = Object.assign({}, object);

现在您创建一个新对象(B),将object上的所有内容复制到其上,然后将其分配给input

现在你有两个变量,input指向Bobj指向A

console.log(obj);   // {x: 1, y: 2}   supposed to be {a: 5, b: 10} but it was not

这是因为您正在查看obj,但您期望的值在input上(您无法访问,因为它不在范围内)。

您可以修改现有对象,而不是创建新对象:

    assign: function(object) {
        Object.assign(input, object);
        console.log(input);
    }

...但不会删除现有值。

如果你想这样做,那么你必须明确地这样做:

    assign: function(object) {
        for (var prop in object) {
          delete object[prop];
        }
        Object.assign(input, object);
        console.log(input);
    }