【问题标题】:Access Single JavaScript Object for multiple node.js files?访问多个 node.js 文件的单个 JavaScript 对象?
【发布时间】:2015-03-11 01:57:48
【问题描述】:

我一直在尝试在多个文件中使用单个 JavaScript 对象。为此,我选择了 JavaScript 中的单例设计模式。

mySingleton.js

var mySingleton = (function () {
var instance;
function init() {
function privateMethod(){
    console.log( "I am private" );
}
var privateVariable = "Im also private";
var privateRandomNumber = Math.random();

return {

  publicProperty: "I am also public",
  publicMethod: function () {
    console.log( "The public can see me!" );
  },

  getRandomNumber: function() {
    return privateRandomNumber;
  }

  };

};

return { 

getInstance: function () {
  if ( !instance ) {
    instance = init();
    console.log("Newly creating an object");
  } 
  return instance;
} 
};
})();
module.exports = mySingleton;

我正在一个单独的节点 js 文件中访问上述对象。如下代码所示

test.js

var singleton = require('./mySingleton');
var obj = singleton.getInstance();
console.log(obj.publicProperty);
console.log('random number value:'+obj.getRandomNumber());

test2.js

var singleton = require('./mySingleton');
var obj = singleton.getInstance();
console.log(obj.publicProperty);
console.log('random number value:'+obj.getRandomNumber());

当我每次创建一个新的 javascript 对象时执行上述两个文件。但我想在多个文件中使用同一个 JavaScript 对象。

提前谢谢....

所以任何人都可以提出任何建议来实现上述功能。

【问题讨论】:

  • 您应该删除java 标签。 Java 是一种与 Javascript 无关的编程语言 :)
  • 您是否使用任何框架,例如 Express 4.0?
  • 你是在一个一个独立的执行test.js和test2.js吗?
  • 你在做node test.js然后运行node test2.js吗?
  • 不@Datsik我没有使用像express这样的任何框架,我只是在普通的节点js文件中使用。是的,我正在这样做“节点 test.js 然后运行节点 test2.js”。

标签: node.js nodes javascript


【解决方案1】:

问题是您正在独立运行 test.js 和 test2.js。 当您执行 test.js 时,它会创建一个全局上下文,其中 obj 绑定到 test.js 的全局范围。 执行完成后,该上下文被销毁并为 test2.js 创建一个新上下文。因此,getInstance 函数中的 instance 变量找不到实例并创建一个新实例。 要正确使用单一模式,您需要使用相同的 singleton 变量来获取实例。

因此,一旦您使用

创建了singleton
var singleton = require('./mySingleton');

您只需要使用此变量获取所有实例。由于单例属性是由于匿名函数的执行关闭而产生的,该函数将对象返回到mySingleton

【讨论】:

    【解决方案2】:

    您单独调用它们是行不通的,每次调用 node test.js 时,您都在创建一个新的运行时变量:

    如果你将它们包含在一个主包中并运行它,你会发现它工作得很好:

    【讨论】:

      猜你喜欢
      • 2019-04-11
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      • 2022-01-14
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多