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