Search code examples
javascriptecmascript-6ecmascript-5

Shorthand for Object.create() with multiple properties


If I want to create an object in JavaScript that has a prototype link to another object, but has several of it's own properties how can I do this?

var object1 = {
  a: 1,
  b: 2
};

var object2 = Object.create( object1 );
object2.c = 3;
object2.d = 4;

console.log( object2 ); // my new object with object1 as it's prototype link

My challenge here is that I have to set object2's properties one at a time.

My other option is:

var object1 = {
  a: 1,
  b: 2
};

var object2 = {
  c: 3,
  d: 4
};
    
Object.setPrototypeOf( object2, object1 );

console.log( object2 );

My challenge above is that the performance is supposed to be terrible. Namely, setPrototypeOf is slow. https://jsperf.com/object-create-vs-object-setprototypeof

And then of course, there's the "shorthand" where you provide, writeable, enumerable and all that to Object.create(), but that's not really shorthand.

Any ideas?


Solution

  • A more elegant way of doing this would be by using spread syntax.

    const obj1 = { a: 1, b: 2 }
    const obj2 = { ...obj1, c: 3, d: 4 }
    console.table(obj1)
    console.table(obj2)
    

    You can even add more properties to the same object in a similar way.

    let obj = { a: 1, b: 2 }
    obj = { ...obj, c: 3, d: 4 }
    console.table(obj)
    

    This also works for arrays.

    let arr = [1, 2]
    arr = [...arr, 3] // Equivalent to Array.push()
    arr = [0, ...arr] // Equivalent to Array.unshift()
    arr = [-1, ...arr, 4] // Equivalent to simultaneous Array.unshift() and Array.push()
    console.table(arr)