Node.JS的内存对象热更代码思路
先来一个测试代码
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对象列表;