JS 函数将对象作为输入,并返回一个对象,该对象对作为参数传递的对象执行操作
JS function takes an object as input and returns an object that performs actions on the object passed as a parameter
我写了一个函数,该函数输入一个对象,该对象可以将值设置为键或直接分配对象。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
.
所以现在你有两个变量(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);
}
在这里: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);
}
};
};
相关文章:
- 如何将javascript对象作为参数传递到c#web服务中
- 将对象作为参数传递时的 Javascript 函数作用域
- 将对象作为参数传递后的未定义属性
- 什么时候需要在javascript中的函数中将对象作为参数传递
- 如何使用没有闪耀模板的角度流星将参数传递给辅助对象
- 如何将对象参数传递给事件处理程序
- 如何在ng重复中的ng单击中将对象作为参数传递?AngularJS
- 将对象作为参数传递给指令
- JS 函数将对象作为输入,并返回一个对象,该对象对作为参数传递的对象执行操作
- 处理在 JavaScript 中作为参数传递的空对象
- 通过将参数传递给我们的构造函数来创建唯一的对象
- 在 javascript 中通过引用传递一个对象参数
- 使用 Function.prototype.bind.apply(Obj, args) 将参数传递给对象,只传递第一个元
- 作为参数传递到函数中的对象的引用是否会更改
- 如何使用 javascript 访问在函数中传递的对象参数
- jQuery - 基于作为函数参数传递的对象构建动态 if 语句
- 停止对作为函数参数传递到新列表的对象引用
- 我正在寻找一种智能方法来检查传递给函数的对象参数
- Javascript 将对象作为函数参数传递
- 在对象上调用方法或将对象作为函数参数传递的差异