2015-09-16 5 views
6

Ad esempio, questo è un codice perfettamente fine. (Lo stile è ES6)Perché le classi immutable.js non richiedono "nuovo"?

import {List} from 'immutable'; 

console.log(List()); // List [] 

Tuttavia, questo non riesce.

class Foo {} 

Foo(); // TypeError: Cannot call a class as a function 

Inoltre, anche questo non funziona.

class Foo extends List {} 

Foo(); // TypeError: Cannot call a class as a function 
+1

Probabilmente perché non sono costruiti usando 'class'? O il transpiler ES6 era in modalità loose. – Bergi

+0

In quale ambiente stai eseguendo questo, quale versione "immutabile" stai usando? – Bergi

+0

La versione 'immutable' è 3.7.5 – almostflan

risposta

6

Sembra che la magia per immutable accade nella loro addon personalizzata al transpiler here.

In pratica stanno creando il proprio createClass che salta il controllo. Questo è uno snippet dalla versione transpiled (tramite babel) del mio codice sopra.

var Foo = (function (_List) { 
    _inherits(Foo, _List); 

    function Foo() { 
    _classCallCheck(this, Board); 

    _get(Object.getPrototypeOf(Foo.prototype), 'constructor', this).apply(this, arguments); 
    } 

    return Foo; 
})(_immutable.List); 

Dove _classCallCheck è come questo.

function _classCallCheck(instance, Constructor) { 
    if (!(instance instanceof Constructor)) { 
     throw new TypeError('Cannot call a class as a function'); 
    } 
} 

Per immutable, sembra che il codice di ES6 viene prima trasformata da includere già i createClass chiamate.