Node.js:导出类/原型与实例的区别

8

由于我大部分的编程工作都是用Java进行的,因此我觉得将一个类导出为Node.js模块比将对象实例导出更具吸引力,例如:

class Connection {
    constructor(db) {
        this.db = db;
    }
    connect(connectionString) {
        this.db.connect(connectionString);
    }
}
exports.Connection = Connection;

由于在依赖模块中需要对类进行多次实例化,因此我仍然需要导出一个已经存在的实例以供生产代码的其余部分使用。 我在同一模块中完成这个操作:

exports.connection = new Connection(require("mongoose"));

这可以实现一定的可测试性,因为真实的依赖关系可以在测试中替换:

const Connection = require("./connection").Connection;

describe("Connection", () => {
    it("connects to a db", () => {
        const connection = new Connection({connect: () => {}});
        // ...
    });
});

这种方法可以奏效,但感觉有些奇怪,因为我在混合两种模式:导出原型(用于单元测试)和实例(用于生产代码)。这种方式可接受吗?我应该继续使用它还是改用其他方式?如果需要更改,那么什么是首选模式?
1个回答

0

你说得没错,这是一种糟糕的编码风格,但实际上你可以编写一个函数,根据接收到的参数返回单个实例(用于整个应用程序)或类本身(用于测试)。就像这样:

class MyClass() {}

const instance = new MyClass();

function getInstanceOrClass(isTesting) {
    if(isTesting) {
        return MyClass;
    } else {
        return instance;
    }
}

exports.getInstanceOrClass = getInstanceOrClass;

// in other files

const getInstanceOrClass = require('./yourFileName');

const classSingletonInstance = getInstanceOrClass();

// in test files

const getInstanceOrClass = require('./yourFileName');

const MyClass = getInstanceOrClass(true);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接