是否有可能得到一个需要的文件不同的范围?
假设我有这个名为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并重新读取文件。