2015-09-16 12 views
6

Na przykład, jest to doskonały kod. (Stylem jest ES6)Dlaczego klasy immutable.js nie wymagają "nowych"?

import {List} from 'immutable'; 

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

Jednak to się nie udaje.

class Foo {} 

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

Co więcej, to również się nie udaje.

class Foo extends List {} 

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

Prawdopodobnie dlatego, że nie zostały skonstruowane przy użyciu "klasy"? Albo transpilator ES6 był w trybie luźnym. – Bergi

+0

W jakim środowisku robisz to, z której 'niezmiennej' wersji korzystasz? – Bergi

+0

'niezmienna" wersja to 3.7.5 – almostflan

Odpowiedz

6

Wygląda jak magia dla immutable dzieje się w ich niestandardowej dodatek do transpiler here.

Zasadniczo tworzą własne createClass, co pomija czek. To jest fragment z transpiled (przez babel) wersji mojego kodu powyżej.

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); 

Gdzie _classCallCheck wygląda tak.

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

Dla immutable wydaje kod ES6 najpierw przekształca się już m.in. połączenia createClass.