这两个功能定义有什么区别

时间:2019-08-29 19:59:50

标签: javascript performance

我正在阅读一篇文章,并遇到了这个函数定义

const circle = (radius) => {
  const proto = { 
    type: 'Circle',
  }
  return Object.assign(Object.create(proto), {radius})
}

为什么他们使用Object.assign,据我了解他们将其用于不变性 但是如果他们使用这个

const circle = (radius) => {
  const proto = { 
    type: 'Circle',
    radius
  }
  return proto;
}

有什么区别?函数定义中没有使用对象的东西,所以为什么要为可变性而烦恼,通常在接收到对象作为参数时使用对象分配。

2 个答案:

答案 0 :(得分:3)

第一个函数返回一个proto[[Prototype]]的对象。因此,type是继承的,而不是返回对象的 own 属性。

第二个函数返回一个具有type的对象,因为它是 own 属性

const circle = (radius) => {
  const proto = { 
    type: 'Circle',
  }
  return Object.assign(Object.create(proto), {radius})
}

const obj = circle(5);

console.log( obj.hasOwnProperty("type") ) // false 
console.log( Object.getPrototypeOf(obj).hasOwnProperty("type") ) // true

const circle = (radius) => {
  const proto = { 
    type: 'Circle',
    radius
  }
  return proto;
}

const obj = circle(5);

console.log( obj.hasOwnProperty("type") ) // true
console.log( Object.getPrototypeOf(obj) === Object.prototype) // true

答案 1 :(得分:1)

除了@adiga的答案外,很有可能这只是一种时尚。很多人已经写了很长时间的JS,并且在不考虑它的情况下养成习惯。

如果您关心的是原始性能,那么创建对象会更快。

benchmarks for the two functions