説明
公開メソッドが内部のprivate配列をそのまま返すと、呼び出し側がその参照を通じてオブジェクトの内部状態を変更できます。
想定される影響
- 権限やポリシー、検証済みの値のリストを外部のコードから変更される可能性があります。
- オブジェクトが維持すべき条件を回避されるおそれがあります。
対処方法
- スプレッド構文、
slice()、Array.from()などで配列をコピーして返してください。 - 外部からの変更が不要なら、不変のデータ構造を公開してください。
- 浅いコピーでは内部のオブジェクトが共有されます。変更可能な要素は必要な深さまでコピーするか、不変の値にしてください。
例
変更前
javascript
class AccessPolicy {
#roles = [];
getRoles() {
return this.#roles;
}
}
変更後
javascript
class AccessPolicy {
#roles = [];
getRoles() {
return [...this.#roles];
}
}
説明:
- 変更前: 呼び出し側が返された参照を通じてprivate配列を変更できます。
- 変更後: コピーを返すことで、配列自体を呼び出し側の変更から分離します。