Javascript 当不存在构造函数时,`new`调用的结果。ES6课程

Javascript 当不存在构造函数时,`new`调用的结果。ES6课程,javascript,meteor,ecmascript-6,Javascript,Meteor,Ecmascript 6,通过阅读课文,我注意到一种特殊的课堂模式 class ListsCollection extends Mongo.Collection { //Other methods, no constructor } export const Lists = new ListsCollection('lists'); 此代码使用new,但没有ListsCollection构造函数。我的解释是,Mongo.Collection的构造函数正在被原型委托调用 在我剩下的代码中,我一直在使用凯尔·辛普森(K

通过阅读课文,我注意到一种特殊的课堂模式

class ListsCollection extends Mongo.Collection {
  //Other methods, no constructor
}
export const Lists = new ListsCollection('lists');
此代码使用
new
,但没有
ListsCollection
构造函数。我的解释是,
Mongo.Collection
的构造函数正在被原型委托调用

在我剩下的代码中,我一直在使用凯尔·辛普森(Kyle Simpson)的OLOO模式,我想在这里使用相同的模式

const ListsCollection = {
  init() {
    //Call the constructor of Mongo.Collection
    return this;
  },
  //Same methods
}
Object.setPrototypeOf(ListsCollection, Mongo.Collection);
export const Lists = Object.create(ListsCollection).init('lists');
我已经开始了,但是我不知道如何调用
Mongo.Collection
类的构造函数。如有任何建议,将不胜感激

编辑-以下答案

我已将第二个代码段中的注释替换为
Mongo.Collection.call(this)
,这应该会达到预期效果。但是,我得到了错误:使用“new”构造Mongo.Collection。我不确定解决这个问题的最佳方法

编辑2-后续调查

在Mongo.Collection构造函数中发现的导致错误的错误行是:

if (! (self instanceof Mongo.Collection))
  throw new Error('use "new" to construct a Mongo.Collection');
由于
instanceof
测试原型链上是否存在
Mongo.Collection.prototype
,因此它显然不存在

这是通过改变

Object.setPrototypeOf(ListsCollection, Mongo.Collection);


我想你想做:

Mongo.Collection.call(this);
在你有意见的地方


请记住,JavaScript中的类,无论是旧版本还是新ES6版本,都是一个表示其自身构造函数的函数。

为什么不坚持使用类呢?我通常会这样做,我只是完成这个模式,看看在项目结束时我对它的感受。这里描述了这些优点:您的第一个示例是否有问题?在我看来,如果Mongo.Collection.call对您不起作用,效果会更好。我应该能做到这两个方面。当然,现在看起来很明显。。。我也在想类似的东西,例如
(新Mongo.Collection).bind(这个)
,但是我知道你不能将
bind
new
结合起来。感谢您的回答,我将尝试使用
Mongo.Collection.call(this)
我得到错误:
error:use“new”构建Mongo.Collection
解决方案。由于我对该答案的编辑已被接受,我将其标记为答案。好吧,也请检查此项,您可以尝试模拟
new
操作符。请记住,错误明确表示
使用“new”来构造
,但这并没有实现。对于他们来说,引入一些在将来与
一起使用时会中断的东西是完全有效的。call
在没有任何重大版本冲突的情况下使用。
Mongo.Collection.call(this);