首页 > 解决方案 > 模块 vs 类 vs 对象字面量

问题描述

这是特定于 nodejs 的。

什么时候最好使用模块、类或对象字面量?

一个模块看起来像这样:

//myModule.js
module.exports = {
    function func1() {
        console.log("func1");
    }
    function func2() {
        console.log("func2");
    }
}

//in another js file
const myModule = require('myModule');
myModule.func1();
myModule.func2();

这个类看起来像这样。我们也可以用 javascript 原型的方式来做这件事,但是为了简单起见在这里做。

//myClass.js
class myClass {
     func1() {
         console.log("Func1");
     }
     func2() {
         console.log("Func2");
     }
}

module.exports = myClass;

//in another js file
const myClass = require('myClass');

let newClass = new myClass();
newClass.func1();
newClass.func2();

最后,我们可以有一个对象字面量单例。

//myObj.js
let myObj = {
    func1: function() {
        console.log("Func1");
    },
    func2: function() {
        console.log("Func2");
    }
};
module.exports = myObj;

//in another js file
let myObj = require('myObj');
myObj.func1();
myObj.func2();

类和对象字面量的区别在于对象字面量充当单例;而类可以有多个实例。

但是对象文字和模块示例之间的区别呢?这些是完全相同的模式吗?

标签: node.js

解决方案


但是对象文字和模块示例之间的区别呢?这些是完全相同的模式吗?

当一个类有可能被正确地用作一个类时,应该使用一个类(例如,如果你想在一个实例上放置或检索数据,而该实例也有方法,那么一个类就非常有意义)。

// MyClass.js
class MyClass {
     func1() {
         console.log("Func1");
     }
     func2() {
         console.log("Func2");
     }
     setData(data) {
         this.data = data;
     }
     getData() {
         return this.data;
     }
}

const instance = new MyClass();
instance.setData('foo');
console.log(instance.getData());

但是,如果像这种情况一样,您只想将相似的函数收集在一起,那么类会使代码更加混乱,而没有真正的好处。代码的读者(可能包括你自己,在后面的某个地方)会期望一个类用于普通对象不能做的事情

您与您myModule.js的几乎相同myObj.js- 两者都在导出一个具有某些属性的普通对象。唯一的区别是中间变量的存在,myObj除了作为中间变量之外不使用。

当您想要可靠地引用导出对象的其他属性时,在导出之前在独立变量中定义要导出的对象会有所帮助:

// a little bit verbose, have to reference `module.exports` every time
// to get to the exported object:
module.exports = {
  getSummary() {
    // using "this" instead may not be reliable without a `bind`
    const { summary } = module.exports.getAllInfo();
    return summary;
  }
  getAllInfo() {
    // ...
  }
};
// a little bit more DRY:
const obj = {
  getSummary() {
    const { summary } = obj.getAllInfo();
    return summary;
  }
  getAllInfo() {
    // ...
  }
};
module.exports = obj;

您也可能(或可能不)考虑将要在独立变量中导出的对象定义为更具可读性。您可以使用任何适合您用例的东西。


推荐阅读