【问题标题】:Result of a `new` call, when no constructor is present. ES6 classes`new` 调用的结果,当没有构造函数存在时。 ES6 类
【发布时间】:2017-08-04 03:33:03
【问题描述】:

查看meteor TODOs app,我注意到了一个特定的类模式。

class ListsCollection extends Mongo.Collection {
  //Other methods, no constructor
}
export const Lists = new ListsCollection('lists');

此代码使用new,尽管没有ListsCollection 构造函数。我的解释是,Mongo.Collection 的构造函数被原型委托调用。

在我的其余代码中,我使用的是Kyle Simpson's OLOO Pattern,我想在这里使用相同的模式。

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 类的构造函数。任何建议将不胜感激:D。

编辑 - 以下答案

我已将第二个代码 sn-p 中的注释替换为 Mongo.Collection.call(this),这应该具有预期的效果。但是,我收到错误Error: use "new" to construct a 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);

Object.setPrototypeOf(ListsCollection, Mongo.Collection.prototype);

【问题讨论】:

  • 为什么不坚持上课?
  • 我通常会,我只是将这个模式完成,看看我在项目结束时对它的感受。优点在这里描述:relevant YDKJS chapter
  • 你的第一个例子有问题吗?如果 Mongo.Collection.call 不适合你,我看起来会更好。
  • 在上面的评论中提到过。我应该能够同时做到这一点。

标签: javascript meteor ecmascript-6


【解决方案1】:

我想你想做:

Mongo.Collection.call(this);

在您发表评论的地方。

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

【讨论】:

  • 当然,现在看起来很明显......我在想类似的东西,例如(new Mongo.Collection).bind(this) 但是我知道你不能将 bindnew 结合起来。谢谢回复,我试试看
  • 不幸的是,使用 Mongo.Collection.call(this) 我得到错误:Error: use "new" to construct a Mongo.Collection
  • 解决问题编辑。由于我对此答案的编辑已被接受,因此我将其标记为答案。
  • 好吧,也检查一下stackoverflow.com/questions/10428603/…,你可以尝试模拟new operator aswel。
  • 请记住,错误明确指出use "new" to construct,这不是这样做的。他们完全可以引入一些在将来与 .call 一起使用时会中断的东西,而不会出现 semver 主要版本的提升。
猜你喜欢
  • 1970-01-01
  • 2015-12-24
  • 2019-01-22
  • 2017-09-29
  • 2018-09-19
  • 1970-01-01
  • 2021-06-29
相关资源
最近更新 更多