javascript - Object.assign 的意外输出
问题描述
所以我有点惊讶:
Object.assign({}, Math)
它返回一个空对象。我这样做是为了设置我自己的数学模块,我可以用我自己的自定义功能进行扩展,所以我认为这样做很方便:
Object.assign({}, Math, {
sqrt: <my-sqrt-implementation>,
add: <my-add-implementation >,
})
但是我惊讶地发现数学条目没有包括在内,这是为什么呢?在我的控制台中,我得到:
Object.assign({}, Math)
> {}
出了什么问题,如何解决?
解决方案
的属性Math
是不可枚举的。Object.assign
将仅复制可枚举和自己的属性:
该
Object.assign()
方法仅将可枚举和拥有的属性从源对象复制到目标对象。它[[Get]]
在源和[[Set]]
目标上使用,因此它将调用 getter 和 setter。因此,它分配属性而不是仅仅复制或定义新属性。如果合并源包含 getter,这可能不适合将新属性合并到原型中。用于将属性定义(包括它们的可枚举性)复制到原型中Object.getOwnPropertyDescriptor()
,Object.defineProperty()
应改为使用。
因此,您应该遵循建议,并使用Object.getOwnPropertyNames(Math)
获取自己的属性名称列表,然后Object.defineProperty()
分配它们:
const props = Object.getOwnPropertyNames(Math)
const myMath = {}
props.forEach(prop => {
Object.defineProperty(myMath, prop, Object.getOwnPropertyDescriptor(Math, prop))
})
myMath.sin(3.14) // 0.00159265...
当然,Object.create
在这里使用原型继承 ( ) 可能会更好。我提供此代码是因为它更接近于 的行为Object.assign
,即赋值。
推荐阅读
- cors - 在目录名称中带有点的特定文件夹中启用 CORS
- mysql - 是否可以在 WHERE 条件下使用 Count() 函数?
- java - 基于平均值的进程总空闲时间算法
- django - 使用 Django 和 Gitlab CI/CD 时如何从 .env 文件中设置变量?
- java - 如何为自定义 SWT-Column-Ratio-Layout 编写 JUnit 测试?
- javascript - 如何在 JSON 中编写 Mathjax 公式并放入 HTML?
- web - 同一页面上的多个 websocket
- python - 是否总是需要在 Python 代码中有 __init__ (构造函数)?什么时候变得不可或缺?
- python - tkinter 中按钮大小的浮点数
- java - 如何通过合并在 IDEA 中运行 Sbt?