我对Coffeescript树实现中的意外行为有疑问,并想知道是否有人可以提供帮助。我认为问题在于错误的“这个”背景,但我不知道在哪里放下胖箭来解决它。也许有人比我更了解咖啡因可以解释这种行为?
class Node
uuid: undefined
constructor: (@uuid) ->
class MultiNode extends Node
branches: {}
constructor: (args...) ->
super(args...)
print: (str = '') ->
console.log "#{str}Multiway<#{@uuid}>"
for value,node of @branches
if node?
node.print "#{str} "
class LeafNode extends Node
value: undefined
constructor: (@value, args...) ->
super(args...)
print: (str = '') ->
console.log "#{str}Leaf<#{@uuid}>: #{@value}"
tree = new MultiNode(1)
subtree1 = new MultiNode(2)
subtree1.branches["aa"] = new LeafNode("three",3)
subtree1.branches["ab"] = new LeafNode("four",4)
tree.branches["a"] = subtree1
subtree2 = new MultiNode(5)
subtree2.branches["ba"] = new LeafNode("six",6)
subtree2.branches["bb"] = new LeafNode("seven",7)
tree.branches["b"] = subtree2
tree.print()
这无限地说,我认为因为'print'的上下文没有像我打算那样设置 子节点对象的那个。我很感激任何指导。
d
答案 0 :(得分:0)
我认为问题在于你如何定义branches
:
class MultiNode extends Node
branches: {}
将branches
附加到MultiNode
类,以便所有MultiNode
个实例通过其原型共享完全相同的@branches
。由于显而易见的原因,这将造成大量混乱。您在类级别定义的任何内容都是原型的一部分,除非您自己执行,否则这些内容都不会复制到实例中。
您需要做的就是确保每个MultiNode
实例都有自己的@branches
:
class MultiNode extends Node
constructor: (args...) ->
@branches = { }
super(args...)
#...
演示:http://jsfiddle.net/ambiguous/vkacZ/
经验法则:
永远不要在(Coffee | Java)脚本中的类/原型中定义可变值,始终在构造函数中定义每个实例(除非您想要共享...)。
PS:你不必说:
if node?
node.print "#{str} "
你可以这样说:
node?.print "#{str} "