javascript - Immutable.js 是如何省略 new 关键字的?

标签 javascript ecmascript-6 immutable.js

所以,一个 ES6 语法难题。据我所知,如果您创建一个 javascript 类,例如:DragonSlayer,然后要创建该类的实例,您需要使用“new”关键字。

let girl = new DragonSlayer();

如果您不想使用“new”关键字,您可以创建一个包装函数。

function ADragonSlayer () {
    return new DragonSlayer() }

let girl = ADragonSlayer();

谁能给我解释一下 Immutable.js 库是如何工作的?

这似乎创建了一个名为 List 的类,然后将具有该类的对象导出为同名属性(您在导入期间通过解构获得)。然而,要创建一个实例,您只需调用该函数即可,根本不需要 new。

const { List } = require('immutable')

let newList = List();

我在源代码中四处搜寻,但到目前为止还无法掌握这种黑魔法是如何构建的。有人有一些指示吗?

最佳答案

它利用 Object.create

constructor你会看到它要么返回:

  1. 传递的值
  2. empty 这是从 emptyList() 返回的值这叫makeList()
  3. 或者直接从 makeList() 调用返回的值。

在 makeList() 内部是对 Object.create() 的调用,它根据传递的原型(prototype)创建一个新对象

https://github.com/facebook/immutable-js/blob/d960d5c4e00f616aa2aec0ecd765735525c6166f/src/List.js#L407

const list = Object.create(ListPrototype);

这就是您调用 List() 时最终返回的内容

还有一个问题here询问使用 Object.create 而不是 new

关于javascript - Immutable.js 是如何省略 new 关键字的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46126406/

相关文章:

javascript - ReactJS - 如何检测一个元素是 ReactJS 中其父元素的第 n 个_第一个_还是最后一个子元素?

javascript - 在 Node.js 中实例化 javascript 类

javascript - 为什么我必须为 React 组件类中定义的方法添加 .bind(this) ,而不是在常规 ES6 类中定义方法

javascript - Promise.all 甚至解决了我希望拒绝的 promise 数组之一

javascript - Immutable.js 中的 GroupBy,然后返回分组列表的第一个值

javascript - 生成包含值及其兄弟值和父值的 HTML 表行

javascript - 从不同 Controller 关闭 Angular 模态

javascript - toJS(不可变)的低转换性能

javascript - 使用 Webpack 为其他项目编译 typescript

reactjs - Immutable JS - 如何用新列表替换列表