Node.JS的内存对象热更代码思路
发布于 7 年前 作者 Goofo 3176 次浏览 来自 分享

先来一个测试代码

class S {
	constructor() {
	}
	doit() {
    	console.log("S:doit();");
	}
}
class A extends S {
	constructor() {
    	super();
	}
	show() {
    	console.log("A:show();");
	}
	doit() {
    	super.doit();
    	console.log("A:doit();");
	}
}
A.prototype.hello = function () {
	console.log("A:hello();");
};
class B extends S {
	constructor() {
    	super();
	}
	show() {
    	console.log("B:show();");
	}
}
B.prototype.hello = function () {
	console.log("B:hello();");
};
const a = new A();
a.show();
a.hello();
a.doit();
a.__proto__ = B.prototype;
a.show();
a.hello();
a.doit();
/// 最终输出
A:show();
A:hello();
S:doit();
A:doit();
B:show();
B:hello();
S:doit();

上面这段代码意思是有A B两个类继承S A实现了S的doit函数 B没有, 参考实例代码可以看出, 通过a.__proto__替换新的 prototype就可替换a的代码, 简单应用场景实例:

player.js

class Player{
	constructor(){
		this.name = "";
	}
	move(x,y){
		
	}
}

scene.js

if( require.cache[require.resolve('./player') ] ){
	delete require.cache[require.resolve('./player') ];
}
const Player = require('./player');
/// 这里假设players挂载了 global对象上
for( let i in global.players ){
	global.players[i].__proto__ = Player.prototype;
}

class Scene{
	constructor(){
	}
}

可以看出 每次delete scene.js的 require.cache 然后require scene的时候 就会触发player的代码热更, 并更新已经生成的player对象列表;

回到顶部