首页 > 解决方案 > 这两个函数定义有什么区别

问题描述

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

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;
}

有什么不同?函数定义中没有任何东西使用对象,所以为什么我们要为可变性而烦恼,通常我们在接收对象作为参数时使用对象分配。

标签: javascriptperformance

解决方案


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

第二个函数返回一个对象type作为它自己的属性

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


推荐阅读