如何在 javscript/node 中导入对象

How to import objects in javscript/node

假设我有一个文件:main2.js

exports.obj = {

x : 10,
setX : function (y)
{
    this.x = y;
},
getX : function()
{
    return this.x;
}
};

有 2 个文件:- abc.js

  const obj = require("./main2").obj;
  describe("Test", function(){

  it("Set X", () => {
  obj.setX(50);

 })
})

def.js

  const obj = require("./main2").obj;
  describe("Test", function(){

  it("Get X", () => {
  console.log(obj.getX());

 })
})

当我 运行 将两个文件放在一起时,得到 50 作为输出 ,但预期 10 作为输出,即需要两个文件应该有不同的 obj 实例,如何实现它

当您使用 require 时,您将获得一个单例实例,因此第二次调用将返回与第一次相同的值。 您必须导出工厂功能。例如:

exports.generateObj = function(){
  return {
    x : 10,
    setX : function (y)
    {
        this.x = y;
    },
    getX : function()
    {
        return this.x;
    }
  }
};

并将其他 .js 更改为:

const obj = require("./main2").generateObj();

而不是:

const obj = require("./main2").obj;

问题是您有一个对象,其中有几个对同一对象的引用。 如果你想每次都有一个不同的对象,你可能想使用一个函数或一个 class 来 return 这个对象。

应该是这样的:

main2.js

exports.obj = function() {
  return {
    x : 10,
    setX : function (y) {
      this.x = y;
    },
    getX : function() {
      return this.x;
    }
  };
};

然后更改其他文件以使用const obj = require("./main2").obj()

也许另一种解决方案是不公开 x

filea.js

//Module.exports 允许您在不命名的情况下导出函数

module.exports = () =>{// or module.exports = function(){
  let x=10;

function setX(i){
  x=i;
}

function getX(){
  return x;
}
  return {getX,setX}
}

fileb.js

const myPseudoClass= require('./fila');
const obj = myPseudoClass();
// can be replaced by const obj = require('./fila')();
console.log('x=',obj.getX());
obj.setX(50);
console.log('x=',obj.getX());