所以,一个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();
我在源代码中搜索过,但到目前为止还无法处理如何构建这样的黑魔法。有人有指点吗?
答案 0 :(得分:2)
在constructor
中,您会看到它会返回:
empty
这是从emptyList()
返回的值makeList()
makeList()
来电返回的值。 makeList()内部是对Object.create()
的调用,它从传递的原型中创建一个新对象
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
的情况下调用。