我在nodejs(最新版本)中用热类重新加载编写程序。
这意味着我创建了一些对象,在程序中使用它们并更改它们的属性和变量。然后我改变一些类源代码,再次要求他们的文件并重新创建每个对象。
在将新对象链接到先前状态之后,所有先前的属性和变量应该像以前一样可用。
对他们的每次访问操作都应该转移到商店隐式。 (store = this)但是父类方法也应该可用。
我想在连接到存储器后重新声明所有不正常的函数(存储可靠)是必要的操作。
如何更改父类才能获得此行为?
示例
描述:
Class B
扩展了具有属性和方法的class A
。
我也有对象store
B类的对象b进入构造函数。
我在儿童中声明的所有方法和属性都应包含在store
中 。
我可以获得如下执行以及如何执行?
代码:
store = {}
class A
constructor: (store)->
@val = 10
# some actions with 'store' there or anywhere
# but child class
class B extends A
constructor: ->
super
@val2 = 20
b = new B(store)
console.log b.val
console.log b.val2
console.log store.val2
# I GET -> I WANT TO GET
# 10 -> 10
# 20 -> undefined
# undefined -> 20
工作表示没有语法错误
编辑(26.02.16):
抱歉示例中的内容不好
编辑(26.02.16):
扩展了描述。
答案 0 :(得分:0)
您必须编写子类构造函数,以便它显式地将属性放在该存储上,而不是放在实例上:
store = {}
class A
constructor: ->
@val = 10
class B extends A
constructor: (s) ->
super
s.val2 = 20
b = new B(store)
console.log b.val # 10
console.log b.val2 # undefined
console.log store.val2 # 20
这并不是真正的解决方法。
答案 1 :(得分:0)
您可以尝试使用Proxy。在B构造函数中创建它并从B构造函数返回它。代理将以这样的方式设置:它将所有属性写入和读取转发到store
,除了B原型中存在的那些(从A继承的那些),那些应该转发到B的实例或直接转发到B的原型。
不确定是否可以在nodejs上运行它,因为Proxy是ES6功能,在节点上原生不支持。巴别塔也不支持它。它可以在Firefox,MS Edge和即将推出的Chrome版本中使用。
https://kangax.github.io/compat-table/es6/#test-Proxy
有一个版本的nodejs使用MS javascript引擎而不是Chrome的V8但是我还没有使用它,我不知道它是否有代理对象:https://github.com/nodejs/node-chakracore
答案 2 :(得分:0)
我发现如果已知类更改的时间,特定的问题可以通过非常简单的方式解决。
如何热门重新加载(算法):
A1
至A2
)a
的自有属性保存到外部对象store
a
A2
store
<强>代码:强>
store = {}
class A
constructor: -> @val = 10
saveTo: (store)->
for own name, val of @
store[name] = val
loadFrom: (store)->
for own name, val of store
@[name] = val
class B1 extends A
dataChange: -> @val2 = 20
class B2 extends A
b = new B1 ; b.dataChange()
console.log b # GOT : B1 {val: 10, val2: 20}
# RELOADED class
store = {}
b.saveTo(store)
# RECREATION of new object
b = new B2
b.loadFrom(store)
console.log b # GOT : B2 {val: 10, val2: 20}