javascript - 将属性添加到object literal并返回

时间:2011-12-21 22:38:07

标签: javascript object

我有对象文字我认为是基础对象:

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吗? - 不,我希望能够将其重新用作下一个呼叫的基础。

4 个答案:

答案 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属性即可。