自分で書こうと思ったコードがまんま見つかったので拝借w

JavaScriptの例な
https://qiita.com/hogefuga/items/eefbbf6f4d2ff682c7e0

console.log(object.value); // no value
object.value = 'test';
console.log(object.value); // value: test

↑これは明らかにカプセル化されてる。
(リンク先を見ればgetter/setter経由なのがわかる)

しかし、objectの実装を以下のように変えても全く同じように動く
const object = {value: 'no value'};


ここでなんかおかしな話だなと気づかなければいけない。
クラスのインターフェースは全く変わらないというのに
クラスの実装によってカプセル化されてる or されてない が決定するのはおかしな話。
もちろんそんな変なことはない。両方とも「カプセル化されてる」んだよ。

Javaにおいて、カプセル化するというのは「getX/setX関数のみを使いパブリックフィールドを直接触らないようにすること」
その理由はパブリックフィールドを直接使うと、内部実装を変更したときにインターフェースが変わってしまうことがあるから

だから、Javaでは全てを「getX/setX関数経由でアクセス」すること=カプセル化であるが、
JavaScriptにおいては、パブリックプロパティを直接参照しても、内部実装を変更したときにインターフェースが
変わらないようになってるから、JavaSciprtではデフォルトで全てのオブジェクトがカプセル化されてると言える

このように言語仕様でデフォルトでカプセル化されてる(もしくはカプセル化のための専用の機能がある)言語には
C#、Ruby、Python、PHP等がある。

言語仕様にカプセル化サポートの機能がある言語では、「引数経由でしか内部状態の参照、書き換えない」は間違い。