是否有可能得到一个需要的文件不同的范围?

假设我有这个名为import.js的示例文件

var self; function Test(a,b){ this.a = a; this.b = b; self = this; } Test.prototype.run = function(){ console.log(self.a, self.b) } module.exports = Test 

当我需要这个文件并创build一个新的“对象”时,所有的东西都可以正常工作,但是当我创build第二个对象时,它们都可以访问自己,只有后者才能工作。

 var Test = require('./import.js'); var one = new Test(1,2); one.run() 1 2 var two = new Test(3,4); two.run() 3 4 one.run() 3 4 

有没有办法重新需要文件,使其创build单独的范围?

把它作为两个不同的variables是行不通的,

 var Test1 = require('./import') var Test2 = require('./import') var one = new Test1(1,2); var two = new Test2(3,4); two.one() 3 4 

但是,复制文件正是我正在寻找..

 var Test1 = require('./import1'); var Test2 = require('./import2'); var one = new Test1(1,2); var two = new Test2(3,4); two.one(); 1 2 

这可能没有修改import.js文件,或复制它?

编辑:

是的,把self重新写进去会有用,但这不是我要求的。 我想知道是否有可能重新build立一个不同的范围。 一个真正的import.js文件可以包含具有recursion调用的健壮对象,通过其他函数传递。 拥有顶级的self ,可以解除您对任何需要或担心的范围和约束力。 假设你有一个复杂的文件,它总是需要一次,但现在进行testing或任何你想导入它两次…还有什么其他选项来重新编码你的工作?

简而言之,不修改import.js文件或复制文件是不可能的。 这是因为self是该文档的全局variables,对于函数对象的每个实例都是一样的。

select#1

问题是你把自己分配给一个全局variables。 这两个都可以访问相同的variables,因此你可以得到观察结果。 另外,你使用自己是不必要的。 下面的代码如你所描述的那样工作。

 function Test(a,b){ this.a = a; this.b = b; } Test.prototype.run = function(){ // Simply using 'this' to access the properties of the function is sufficient - no need for self console.log(this.a, this.b) } module.exports = Test 

工作示例

在这种情况下,每个new Test()实例都会有一个单独的实例,因此您不需要“重新请求”这些文件。

select#2

如果你想保持self的编辑,另一个select是只重写你想要调用的函数。 例如:

 var Test = require('./import.js'); Test.prototype.run = function(){ console.log(this.a, this.b) } 

如果这也不是一个选项,那么你需要提供更多的信息,你可以或不可以做什么。

至less有两种可能的方式….

(1)删除caching

如何在node.js中的“require”之后移除模块?

 var Test1 = require('./import.js'); delete require.cache[require.resolve('./import.js')] var Test2 = require('./import.js'); var one = new Test1(1,2); var two = new Test2(3,4); one.run() 1 2 two.run() 3 4 

甚至不会看起来那么混乱,尽pipe它非常低效,并且以这种方式编写代码的代价非常快。


(2)使用function范围

因为require需要读取文件然后运行它,

 var Test = require('./test.js'); 

是等同的

 var Test = eval( fs.readFileSync('./test.js', 'utf8') ); 

所以,如果不使用require,你可以读取文件,在函数内部build立新的范围:

 var fs = require('fs'); var File = fs.readFileSync('./import.js', 'utf8'); var Test1, Test2; (function(){ Test1 = eval(File); })(); (function(){ Test2 = eval(File); })(); 

文件内部的自我现在将存储在您创build的函数范围内。 所以再一次:

 var one = new Test1(1,2); var two = new Test2(3,4); one.run() 1 2 two.run() 3 4 

稍微混乱,但要快得多,然后删除caching并重新读取文件。