【问题标题】:Javascript ES6 on Nodejs : TypeError: object is not a constructorNode Js中的Javascript ES6:TypeError:对象不是构造函数
【发布时间】:2016-07-27 18:20:25
【问题描述】:

我有这个示例类 sync.js 作为我项目某处的模块。

'use strict';

export default class Sync{

    constructor(dbConnection){
        this.dbConnection = dbConnection;
    }

    test(){
        return "This is a test " + this.dbConnection;
    }
}

然后在我的控制器上的某个地方我使用这个类:

'use strict';

import Sync from '../../path/to/module'; // <-- works fine

const sync = new Sync('CONNECTION!'); // <-- meh

console.log(sync.test());

我期待在控制台This is a test CONNECTION! 上记录类似的内容。但相反,我收到了这个错误。 TypeError: object is not a constructor

我做错了什么?

顺便说一句,如果我删除了const sync = new Sync('CONNECTION!'); 行并将console.log() 更改为console.log(Sync.test());,则会打印输出This is a test undefined,这与我的预期相符。但是我的实例化有什么问题?

WTF?

编辑

伙计们,我想我发现了问题,基于@JLRisherem035 指出,它返回的是类的实例而不是类本身。实际上有一个index.js 导入'./sync' js 文件,导出为export default new Sync();。这是整个index.js

'use strict';

import Sync from './sync';

export default new Sync(); // <-- potential prodigal code

模块树如下所示。

module
  |
  |_ lib
  |  |_ index.js // this is the index.js I am talking about
  |  |_ sync.js
  |
  |_ index.js // the entry point, contains just `module.exports = require('./lib');`

现在。如何在不执行new 的情况下导出export default new Sync();

【问题讨论】:

  • 这对我来说很好
  • WTH?真的吗? @nem035 这很奇怪。 :(
  • 您确定没有在默认导出中意外添加new 吗?您向我们展示的代码确实导出了类,而不是实例。
  • @TheGreenFoxx 看起来很清楚你的Sync 变量是Sync 类的instance,而不是类本身。虽然说不出为什么。您是否向我们展示了您的 sync.js 文件的完整内容(未修改)?
  • @TheGreenFoxx 但它是整个模块代码吗?你确定你没有在里面的某个地方做Sync = new Sync吗?

标签: javascript node.js ecmascript-6


【解决方案1】:

编辑 2

如何导出 export default new Sync();不做新的?

只需从module/lib/index.js 中删除new 关键字:

import Sync from './sync';

export default Sync;

或者直接从module/lib/sync.js导入


编辑 1

根据您所说的记录,

Sync { dbConnection: undefined }

似乎您的导入正在返回类的实例(它是一个对象),而不是类定义本身。

所以console.log(new Sync()) 会返回你所说的,

class Sync {

  constructor(dbConnection) {
    this.dbConnection = dbConnection;
  }

  test() {
    return "This is a test " + this.dbConnection;
  }
}

console.log(new Sync());

不是console.log(Sync)

class Sync {

  constructor(dbConnection) {
    this.dbConnection = dbConnection;
  }

  test() {
    return "This is a test " + this.dbConnection;
  }
}

console.log(Sync);

您确定在导出之前没有在任何地方调用new Sync


初步回答

有问题的代码可以正常工作:

'use strict';

class Sync {

  constructor(dbConnection) {
    this.dbConnection = dbConnection;
  }

  test() {
    return "This is a test " + this.dbConnection;
  }
}

const sync = new Sync('CONNECTION!');

console.log(sync.test());

根据您的错误:

TypeError: object is not a constructor

您的 import 没有返回您认为返回的内容,您正在尝试 new 无法实例化的内容。

您的import 路径很可能是错误的。

【讨论】:

  • 很奇怪,但是import 已经返回了类,我尝试打印它并且输出是Sync { dbConnection: undefined } 是这样吗?
  • 不,这看起来像一个对象。记录一个类应该以字符串形式给出一个功能块(在 Chrome 中):function class Sync { constructor(dbConnection) { this.dbConnection = dbConnection; } test() { return "This is a test " + this.dbConnection; } }
  • 直接从路径导入似乎效果不佳。该死的。嘿,非常感谢兄弟!这对我帮助很大。 :)
  • "达到每日投票上限;"哈哈! 4小时后会投票赞成这个:)
  • 实际上...export default Sync; 工作!但是 nodejs 会缓存更改吗?因为它似乎不会立即适用。 :/我必须重新运行代码几次才能正确触发。 ://
【解决方案2】:

因为这是 google 上的最高结果:

如果你在 Node 中使用 require() 语句来导入类并引入循环依赖,你会突然看到这个错误弹出,因为 require() 正在返回 {} 而不是类。

【讨论】:

  • 是的,这通常只是 Node 中的循环依赖
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多