我有对象文字我认为是基础对象:
var obj = {
key1 : 'value1',
key2 : 'value2'
}
并希望使用此对象并将其传递给具有扩展功能,如
myFunction( obj + { key3 : 'value3' } );
// param became:
{
key1 : 'value1',
key2 : 'value2',
key3 : 'value3'
}
或
myFunction( obj + { key2 : 'new value2' } );
// param became:
{
key1 : 'value1',
key2 : 'new value2'
}
+
运算符不正确。我怎么能这样做?这是一种方式吗?
obj
吗? - 不,我希望能够将其重新用作下一个呼叫的基础。
答案 0 :(得分:5)
如果您可以更改obj
,只需在传递之前进行更改:
var obj = { /* stuff */ };
obj.key3 = 'value3';
myFunction(obj);
你想永久改变obj吗? - 不,我希望能够将其重新用作下一个呼叫的基础。
好的,所以你需要make a copy of obj
并更改副本 - 在致电myFunction
之前:
var obj = { /* stuff */ };
var extension = {key3: 'value3'};
myFunction($.extend({}, obj, extension));
或将obj
和“扩展程序”传递给myFunction
:
var obj = { /* stuff */ };
var extension = {key3: 'value3'};
myFunction(obj, extension);
让myFunction
完成工作:
function myFunction(base, ext)
{
if (typeof base === 'object' && typeof ext === 'object')
{
base = $.extend({}, base, ext);
}
// rest of the function logic here
}
如果您已经(或不介意)使用jQuery,$.extend()
将是您完成此任务的最佳朋友。
答案 1 :(得分:1)
通过ES2018或TypeScript 2.1,您可以使用object spread syntax。
myFunction({ ...obj, key3: 'value3' });
在ES2015中,您可以使用Object.assign。
myFunction(Object.assign({ key3: 'value3' }, obj));
答案 2 :(得分:0)
您可以创建一个非破坏性地扩展对象的函数(不是“扩展”,实际上,只是从另一个中创建一个新对象),例如:
var oldObj = {name: 'foo'};
function extendNonDestructive(src, newProps) {
function F() {} F.prototype = src;
var newObj = new F;
for (var p in newProps) {
if (newProps.hasOwnProperty(p)) {
newObj[p] = newProps[p]
}
}
return newObj
}
var newObj = extendNonDestructive(oldObj, {lastName: 'bar'}); // Doesn't touch oldObj
注意:您可能对Object.create感兴趣,这比小“函数F(){}更灵活; F.prototype = src;”在我的代码中,但它是ES5 +。
答案 3 :(得分:0)
如果要向现有对象添加属性并在一行中返回新对象,则可以使用Object.fromEntries和Object.entries函数的组合:
console.log(
Object.fromEntries(
Object.entries({
t:4,
f:2
})
.concat(
Object.entries({
q:2,
p:9
})
)
)
);
....concat(Object.entries({t:2}))...
只需修改原始对象的t
属性即可。