具有单实例模式的循环依赖性

时间:2018-03-15 16:43:18

标签: javascript node.js ecmascript-6

我有两个类,以单实例模式导出

// classA.js
let ClassB = require('./classB')
let ClassA = class ClassA {

  constructor () {
    this.name = 'ClassA'
  }

  getName () {
    return this.name
  }

  getOtherName () {
    return ClassB.getName()
  }

}

module.exports = (function() {
  return new ClassA()
})()


// classB.js
let ClassA = require('./classA')
let ClassB = class ClassB {

  constructor () {
    this.name = 'ClassB'
  }

  getName () {
    return this.name
  }


  getOtherName () {
    return ClassA.getName()
  }

}

module.exports = (function() {
  return new ClassB()
})()

在这两种情况下,运行getOtherName()都会抛出错误,因为另一个类对象是一个空对象。

我已经阅读了this帖子,其中有一些信息可以通过ES6前类定义(原型样式)来解决这个问题,但这些解决方案似乎都不适用。

例如,在定义方法之前无法导出类。我可以想办法解决这个问题,因为班级不是单身人士,但每个班级需要一个实例,这让我觉得更难。

对此最佳解决方案是什么?

1 个答案:

答案 0 :(得分:0)

在您真正需要之前,请不要加载ClassA。变化

let ClassA = require('./classA')
// ...

getOtherName () {
  return ClassA.getName()
}

getOtherName () {
  return require('./classA').getName()
}

另外

module.exports = (function() {
  return new ClassA()
})()

毫无意义。只是做

module.exports = new ClassA();

或者,由于这些是单例类,所以根本不要使用单例类,并使您的函数成为模块的一部分。

// classB.js
let ClassA = require('./classA');

const name = 'ClassB';

exports.getName = function () {
  return name;
};

exports.getOtherName = function() {
  return ClassA.getName();
};

因为当module.exports已经是对象时,没有理由拥有单独的实例对象。