【问题标题】:Node.js v6.2.0 class extends is not a function error?Node.js v6.2.0 类扩展不是函数错误?
【发布时间】:2016-09-15 16:23:33
【问题描述】:

所以我试图在 node js 中扩展一个类,编译器不断返回以下错误:

TypeError: Class extends value #<Object> is not a function or null

我检查了我是否正确导出了课程,我是,有什么想法吗?我将在下面发布我的代码:

/handler/venue.js:

var VenueViews = require('../views/venue'); // If I remove this the error will dissapear (as expected)
class Venue {
  constructor(data) {
    this.setDataHere = data;
  }

  main () {
   var View = new VenueViews(); // This doesn't run
  }


}

module.exports = Venue;

/views/venue.js:

var Venue = require('../handlers/venue');
console.log  (Venue) // This returns {} ???

class VenueViews extends Venue {
  constructor() {
    super();
  }
}

module.exports = VenueViews;

我知道节点支持这些es6 features,所以我不确定它们为什么不起作用?

编辑:

我不确定这是否会发生,但是当我记录我的 Venue 要求时,它会返回一个空对象 {}

console.log  (Venue) // This returns {} ???

【问题讨论】:

  • 今天早些时候有些人遇到了同样的问题:stackoverflow.com/q/37307471/218196。问题:循环引用。解决方案:想办法避免循环引用。
  • 我的代码有什么特点?我只是想继承所有Venue 类属性并在VenueViews 类中使用它们。 @FelixKling
  • “我的代码有什么循环?” /views/venue.js 导入 /handler/venue.js 导入 /views/venue.js 导入 /handler/venue.js .... 我可以继续: P
  • 您的视图不应该从场地继承。
  • 是的,现在我明白了! @FelixKling 没有注意:P

标签: javascript node.js ecmascript-6


【解决方案1】:

事实证明,我的代码中有一个循环引用,其中我是 importing 正在扩展的类,进入本身正在扩展的类(绕口令:P)。

显而易见的解决方法是简单地删除 extends 引用并找到另一种方法来实现我想要实现的目标。在我的例子中,它将Venue 类属性向下传递到VenueViews 构造函数中。

例如var x = VenueViews(this)

【讨论】:

  • > 将正在扩展的类导入到本身正在扩展的类中 对我来说,这听起来像是糟糕设计的标志。没必要,但考虑一下。就我而言,我在一个文件中有一个基类 B,在其他文件中有派生类 X、Y、Z。然后在 B 所在的 sam 文件中,我有另一个使用 X、Y 和 Z 的类 M。我只是将 B 移动到一个单独的文件中。
【解决方案2】:

在我的例子中,由于我试图在 Typescript 中设置工厂模式,这与 @James111 遇到的问题(循环导入)相同。我的解决方法是将代码移动到文件中,类似于以下内容:

// ./src/interface.ts
import { ConcreteClass } from './concrete';

export interface BaseInterface {
   someFunction(): any;
}

export class Factory {
  static build(): BaseInterface {
     return new ConcreteClass();
  }
}

// ./src/base.ts
import { BaseInterface } from './interface';
class BaseClass implements BaseInterface {
  someFunction(): any {
    return true;
  }
}

// ./src/concrete.ts
import { BaseClass } from './base';
export class ConcreteClass extends BaseClass {
  someFunction(): any {
    return false;
  }
}

【讨论】:

  • 现在是 2018 年,情况仍然如此...... :( 使用 react,webpack 无法很好地处理类的扩展。
  • @Blaskovicz 你能详细解释一下这是如何工作的吗?
【解决方案3】:

我遇到过类似的问题,在检查了所有解决方法后,通过删除 node_modules 文件夹并运行 npm i 最终解决了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2016-03-15
    • 2021-04-15
    • 2015-11-05
    • 2019-02-05
    • 2021-02-01
    • 1970-01-01
    相关资源
    最近更新 更多