儿童班的Coffeescript外部物业商店

时间:2016-02-25 22:08:48

标签: javascript coffeescript

我在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

jsfiddle working example

工作表示没有语法错误

编辑(26.02.16):

抱歉示例中的内容不好

编辑(26.02.16):

扩展了描述。

3 个答案:

答案 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)

我发现如果已知类更改的时间,特定的问题可以通过非常简单的方式解决。

如何热门重新加载(算法):

  1. (课程变更时刻A1A2
  2. 将对象a的自有属性保存到外部对象store
  3. 使用课程a
  4. 重新创建对象A2
  5. 从对象store
  6. 加载属性

    <强>代码:

    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}
    

    jsfiddle