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

JS function takes an object as input and returns an object that performs actions on the object passed as a parameter

本文关键字:对象 参数传递 操作 执行 函数 输入 JS 返回 一个对象      更新时间:2023-09-26

我写了一个函数,该函数输入一个对象,该对象可以将值设置为键或直接分配对象。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
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);
    }

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

问题是每次调用分配函数时它都会创建新对象。要扩展输入对象,请使用 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);
        }
    };
};