2017-09-09 23 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