我写了一个函数,它输入一个可以将值设置为键或直接分配对象的对象。 setter和getter工作正常,但是当对象被分配给另一个对象时,它不能很好地工作(对象根本不会改变)。
奇怪的是当对象输出"内部"结果正确的功能。但结果不是我所期望的那样"外面"功能。任何人都可以解释一下吗?
string(6) "Test 5"
答案 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
。
现在你有两个变量(input
和obj
),它们的值都是对A的引用。
input = Object.assign({}, object);
现在您创建一个新对象(B),将object
上的所有内容复制到其上,然后将其分配给input
。
现在你有两个变量,input
指向B
,obj
指向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);
}