javascript - 这两个函数定义有什么区别
问题描述
我正在阅读一篇文章并遇到了这个函数定义
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;
}
有什么不同?函数定义中没有任何东西使用对象,所以为什么我们要为可变性而烦恼,通常我们在接收对象作为参数时使用对象分配。
解决方案
第一个函数返回一个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
推荐阅读
- java - 在 H2 中添加新数据的可能性有多大?
- jasper-reports - Jaspersoft Studio 中的高级图表格式
- python - 在更新对象时从对象中读取
- python - 如何在 Pyqtgraph 上将平移事件从滚轮按下+拖动更改为鼠标右键单击+拖动?
- amazon-web-services - 如何将 Kinesis 数据流合并为一个以进行 Kinesis 数据分析?
- javascript - 如何以编程方式放置自定义 Leaflet.draw 形状?
- r - 在 R 中合并两个数据帧时出现 X.1、X.2、X.3
- python - 硒中的ElementClickInterceptedException
- php - 更改 /var 的权限是否安全,如果是,如何完成?如果没有,我该怎么办?
- c# - Windows 服务:运行通知方法时重新启动线程/任务会引发异常