Immutable.js如何省略new关键字?

时间:2017-09-09 01:39:06

标签: 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的类,然后将该类的对象导出为同名属性(在导入期间通过解构获得)。然而,要创建一个实例,您只需调用该函数即可。

const { List } = require('immutable')

let newList = List();

我在源代码中搜索过,但到目前为止还无法处理如何构建这样的黑魔法。有人有指点吗?

2 个答案:

答案 0 :(得分:2)

它利用Object.create

constructor中,您会看到它会返回:

  1. 传递的值
  2. empty这是从emptyList()返回的值makeList()
  3. 或直接从makeList()来电返回的值。
  4. makeList()内部是对Object.create()的调用,它从传递的原型中创建一个新对象

      

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

    const list = Object.create(ListPrototype);
    

    这最终是您致电List()

    时返回的内容

    还有一个问题here询问使用Object.create代替new

答案 1 :(得分:1)

没有new

,无法实例化类是正确的
class List {}; List()
// TypeError: class constructors must be invoked with |new|

但是你可能require compiled version of immutable.js,其中类声明被编译为:

var List = (function (IndexedCollection$$1) {
  function List(value) {
    // ...
   return empty.withMutations(function (list) {
  }
  // ...
  return List;
}(...))

...可以在没有new的情况下调用。