Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS函数接受一个对象作为输入,并返回一个对象,该对象对作为参数传递的对象执行操作_Javascript_Function_Object - Fatal编程技术网

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

Javascript JS函数接受一个对象作为输入,并返回一个对象,该对象对作为参数传递的对象执行操作,javascript,function,object,Javascript,Function,Object,我编写了一个函数,输入一个对象,可以将值设置为键或直接指定一个对象。setter和getter工作得很好,但是当对象被分配给另一个对象时,它工作得不好(对象根本没有变化) 奇怪的是,当对象在函数“内部”输出时,结果是正确的。但结果并不是我所期望的“外部”功能。有人能解释一下吗 function foo(input) { return { set: function(key, value) { input[key] = value;

我编写了一个函数,输入一个对象,可以将值设置为键或直接指定一个对象。setter和getter工作得很好,但是当对象被分配给另一个对象时,它工作得不好(对象根本没有变化)

奇怪的是,当对象在函数“内部”输出时,结果是正确的。但结果并不是我所期望的“外部”功能。有人能解释一下吗

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

var obj = {},
    bar = foo(obj);

bar.set('x', 1);    // {x: 1}
console.log(obj);   // {x: 1}
bar.set('y', 2);    // {x: 1, y: 2}
console.log(obj);   // {x: 1, y: 2}   so far so good
bar.assign({        // {a: 5, b: 10}
    a: 5,
    b: 10
});
console.log(obj);   // {x: 1, y: 2}   supposed to be {a: 5, b: 10} but it was not
bar.assign({        // {a: 15}
    a: 15
});
console.log(obj);   // {x: 1, y: 2}   didn't change at all
bar.set('b', 20);   // {a: 15, b: 20}
console.log(obj);   // {x: 1, y: 2}
console.log(bar.get('a'));  // 15

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

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

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

现在,将引用A的
obj
的值传递给
foo

…然后将其分配给
输入

现在有了两个变量(
input
obj
),它们的值都是a的引用

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

现在有两个变量,
input
指向
B
obj
指向
A

这是因为您正在查看
obj
,但所需的值位于
输入上(由于不在范围内,您无法访问该值)


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

    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);
    }

Internet Explorer不支持Object.assign方法。谢谢@xxxmatko。我将使用for in循环来访问它的属性。这确实解决了我的问题。感谢您的快速回复,并花时间解释清楚这一点!
bar = foo(obj);
function foo(input)
input = Object.assign({}, object);
console.log(obj);   // {x: 1, y: 2}   supposed to be {a: 5, b: 10} but it was not
    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);
    }