C++/Java のバックグラウンドを持つ私は、CoffeeScript の OOP 継承に戸惑いました。
次の例を検討してください。
class BaseClass
arr: []
addItem: (item) =>
@arr.push item
class SubClassA extends BaseClass
constructor: ->
@addItem("fromSubA")
class SubClassB extends BaseClass
console.log "Case 1"
instB = new BaseClass()
instA = new SubClassA()
console.log "instA: #{JSON.stringify instA.arr}"
console.log "instB #{JSON.stringify instB.arr}"
console.log "Case 2"
instB = new SubClassB()
instA = new SubClassA()
console.log "instA: #{JSON.stringify instA.arr}"
console.log "instB #{JSON.stringify instB.arr}"
console.log "Case 3"
instB = new SubClassB()
instA = new SubClassA()
console.log "instA: #{JSON.stringify instA.arr}"
console.log "instB #{JSON.stringify instB.arr}"
tinkerbin.com での出力:
Case 1
instA: ["fromSubA"]
instB ["fromSubA"]
Case 2
instA: ["fromSubA","fromSubA"]
instB ["fromSubA","fromSubA"]
Case 3
instA: ["fromSubA","fromSubA","fromSubA","Added manually, only to instB"]
instB ["fromSubA","fromSubA","fromSubA","Added manually, only to instB"]
Iow: base-class の「arr」インスタンス プロパティは、多かれ少なかれ静的プロパティのように動作します。あるインスタンスで配列を変更すると、他のインスタンスでも変更されます。この配列がインスタンス間で共有されるのはなぜですか?
紛らわしいことに、文字列プロパティはこの動作を示しません。
class BaseClass
property: "From Base"
class SubClassA extends BaseClass
constructor: ->
@property = "fromSubClassA"
class SubClassB extends BaseClass
document.write "Case 1<br>"
instB = new BaseClass()
instA = new SubClassA()
document.write "#{instA.property} <br>"
document.write "#{instB.property} <br><br>"
document.write "Case 2<br>"
instB = new SubClassB()
instA = new SubClassA()
instA.property = "test"
document.write "#{instA.property} <br>"
document.write "#{instB.property} <br>"
このコードは問題なく機能し、「プロパティ」プロパティをインスタンス間で分離したままにします。
私は明らかにここで何かを誤解しています。アレイがインスタンス間で共有される原因は何ですか?