Как импортировать объекты в javscript / node - PullRequest
2 голосов
/ 11 февраля 2020

Предположим, у меня есть файл: main2. js

exports.obj = {

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

Имеет 2 файла: - ab c. 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, как этого добиться

Ответы [ 3 ]

2 голосов
/ 11 февраля 2020

Проблема в том, что у вас есть один объект с парой ссылок на один и тот же объект. Если вы хотите, чтобы каждый раз был другой объект, вы можете использовать функцию или класс, который будет возвращать этот объект.

Должно выглядеть следующим образом:

main2. js

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

, а затем измените другие файлы для использования const obj = require("./main2").obj()

1 голос
/ 11 февраля 2020

Когда вы используете require, вы получаете единственный экземпляр, поэтому второй вызов возвращает то же значение, что и first. Вы должны экспортировать фабричную функцию. Пример:

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;
0 голосов
/ 11 февраля 2020

может быть, другим решением было бы разоблачить 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...