【问题标题】:`Object.defineProperty(exports, '__esModule', { value: true })` vs `exports.__esModule = true` [duplicate]`Object.defineProperty(exports, '__esModule', { value: true })` vs `exports.__esModule = true` [重复]
【发布时间】:2019-11-16 17:21:33
【问题描述】:

我认为这是:

Object.defineProperty(exports, '__esModule', { value: true })

应该给出与此相同的结果:

exports.__esModule = true

但是我见过的所有 UMD 包生成器都使用了第一个选项。有什么原因吗?

【问题讨论】:

  • 不同之处在于第一个创建了一个不可枚举属性。我想这是主要原因。
  • @FelixKling 啊,有道理
  • @Bergi 这个问题不是重复的。问题是关于选择将Object.defineProperty 用于 ES 模块,这是一个非常具体的用例。

标签: javascript ecmascript-6 es6-modules umd


【解决方案1】:

Object.defineProperty() 的默认值与正常分配属性不同。具体来说,如果您不指定以下属性,则默认为false

configurable
enumerable
writable

因此,Object.defineProperty(exports, '__esModule', { value: true }) 将具有相同的值,但不可配置、可枚举或可写,而 exports.__esModule = true 将所有这些属性都默认为 true

您可以在Object.definePropert()here on MDN 上阅读有关此级别的详细信息。

但是我见过的所有 UMD 包生成器都使用了第一个选项。有什么原因吗?

据推测,这些工具的设计者希望配置该属性,使其无法更改(可写)或删除(可配置)或枚举。

【讨论】:

  • 呵呵,我一直以为 writable 默认是真的……TIL.
猜你喜欢
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
相关资源
最近更新 更多