2017-09-09 21 views
1

所以,ES6的语法谜题。至于我可以看到,如果你创建一个JavaScript类,例如:DragonSlayer然后创建该类的实例,你需要使用'新'关键字。Immutable.js如何省略new关键字?

let girl = new DragonSlayer(); 

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

function ADragonSlayer() { 
    return new DragonSlayer() } 

let girl = ADragonSlayer(); 

那么任何人都可以向我解释Immutable.js库的工作原理吗?

似乎创建一个名为List的类,然后将该类的对象作为同名属性(您在导入过程中通过解构获得)导出。然而要创建一个实例,你可以直接调用这个函数。

const { List } = require('immutable') 

let newList = List(); 

我在源代码周围觅食,但到目前为止一直未能得到怎么这么黑魔法已经架构的手柄。任何人都有一些指针?

+1

文库被转化到ES5(ES3):https://github.com/facebook/immutable-js/blob/c0308e7944956c2e3d5afe6c80a4869a92980f11/dist/immutable.js#L2899 –

回答

0

你说得对,类不能没有new被实例化:

class List {}; List() 
// TypeError: class constructors must be invoked with |new| 

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

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

。 ..这可以调用没有new

1

它利用Object.create

constructor你会看到它要么返回回:

  1. 通过
  2. empty的值,它不同于emptyList()返回的值调用makeList()
  3. 或者直接从makeList()呼叫返回的值。

内makeList()是Object.create()的呼叫从传递原型创建新的对象

https://github.com/facebook/immutable-js/blob/master/src/List.js#L382

const list = Object.create(ListPrototype); 

这最终将返回什么,当你致电List()

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

+0

有趣好玩功能对对象的一系列和示出'Object.assign()'和'Object.create()'如果你想更好地理解它们。这些和功能工厂与node.js一起非常靠近我的心脏。 – agm1984

+0

我不能给你一个光滑的答案,但我知道Object.create()基本上创建了一个对另一个对象原型的引用,但是它做了一些类似于“完全”创建的东西,所以它对增加内存性能有一些影响。其他人可以为你收紧这个定义。 – agm1984