クラスメソッドのプロパティはインスタンスで共有されてしまう
クラスメソッドのプロパティはインスタンスで共有されてしまう:
他の人のソースを触っていて、以下のような現象に遭遇。
classのメソッドはprototypeに宣言されることが原因でした。
hogeはメソッド定義されていますのでprototypeに宣言され、その中にvalというプロパティが作成されてしまいます。
その結果、何個インスタンスを生成しようとも、最後に生成されたインスタンスで戻り値が上書きされてしまうわけです
上記はchromeのコンソールで確認しましたが、babelでプリコンパイルしても同様の挙動になります。
(babelもクラスメソッドはprototypeに宣言するから)
そもそも上記のようなコンストラクタの記述が好ましくないと思うのですが、他人のソースなので意図が読めず・・・(grepしたけど、hoge.valはどこにも使用されていなかった)
以上、わかればどうということはないのですが、挙動やソースが意味わからなさすぎて2時間くらいかかりました
インスタンスごとに同じ値が取得できてしまう
他の人のソースを触っていて、以下のような現象に遭遇。hoge.val()
の結果が最後に作成したインスタンスの値になってしまう。class Test { constructor(commonVal) { this.commonVal = commonVal; this.hoge.val = () => this.commonVal; } hoge() { // do something.... return; } } const fuga = new Test('aaaaaaaaaaa'); const fuga2 = new Test('bbbbbbbbbbb'); fuga2.hoge.val() // ← "bbbbbbbbbbb" fuga.hoge.val() // ← "bbbbbbbbbbb" !?
原因
classのメソッドはprototypeに宣言されることが原因でした。hogeはメソッド定義されていますのでprototypeに宣言され、その中にvalというプロパティが作成されてしまいます。
その結果、何個インスタンスを生成しようとも、最後に生成されたインスタンスで戻り値が上書きされてしまうわけです
上記はchromeのコンソールで確認しましたが、babelでプリコンパイルしても同様の挙動になります。
(babelもクラスメソッドはprototypeに宣言するから)
そもそも上記のようなコンストラクタの記述が好ましくないと思うのですが、他人のソースなので意図が読めず・・・(grepしたけど、hoge.valはどこにも使用されていなかった)
以上、わかればどうということはないのですが、挙動やソースが意味わからなさすぎて2時間くらいかかりました
コメント
コメントを投稿